

# `CREATE FUNCTION`
<a name="create-function-syntax-support"></a>

`CREATE FUNCTION`은 새 함수를 정의합니다.

**중요**  
Amazon Aurora DSQL에서 `CREATE FUNCTION`은 SQL 언어 함수(`LANGUAGE sql`)만 지원합니다.

## 지원되는 구문
<a name="create-function-supported-syntax"></a>

```
CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE sql
    | { IMMUTABLE | STABLE | VOLATILE }
    | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
    | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | RETURN expression
    | BEGIN ATOMIC statement; [ statement; ... ] END
  } ...

where LANGUAGE must be sql
```

## 설명
<a name="create-function-description"></a>

`CREATE FUNCTION`은 새 함수를 정의합니다. `CREATE OR REPLACE FUNCTION`은 새 함수를 생성하거나, 기존 정의를 교체합니다. 함수를 정의할 수 있으려면 언어에 대한 `USAGE` 권한을 가지고 있어야 합니다.

스키마 이름이 포함되면 지정된 스키마에 함수가 ​​생성됩니다. 그렇지 않으면, 함수가 현재 스키마로 생성됩니다. 새 함수의 이름은 동일한 스키마에서 동일한 입력 인수 유형을 가진 기존 함수와 일치하지 않아야 합니다. 그러나 다양한 인수 유형의 함수는 이름을 공유할 수 있습니다(이를 *오버로드*라고 함).

기존 함수의 현재 정의를 바꾸려면 `CREATE OR REPLACE FUNCTION`을 사용합니다. 이러한 방식으로 함수의 이름 또는 인수 유형을 변경할 수 없습니다(실제로는 고유한 새 함수를 생성함). 또한 `CREATE OR REPLACE FUNCTION`을 사용하여 기존 함수의 반환 유형을 변경할 수 없습니다. 이렇게 하려면 함수를 삭제하고 다시 생성해야 합니다.

`CREATE OR REPLACE FUNCTION`이 기존 함수를 대체하는 데 사용되는 경우 함수의 소유권 및 권한은 변경되지 않습니다. 다른 모든 함수 속성에는 명령에 지정되거나 암시된 값이 할당됩니다. 함수를 대체하려면 함수를 소유해야 합니다(소유 역할의 멤버가 되는 것 포함).

함수를 삭제한 다음 다시 생성하는 경우 새 함수는 이전 함수와 동일한 개체가 아닙니다. 이전 함수를 참조하는 기존 규칙, 뷰 등을 삭제해야 합니다. 함수를 참조하는 객체를 손상시키지 않고 함수 정의를 변경하는 데 `CREATE OR REPLACE FUNCTION`을 사용합니다.

생성한 함수의 소유자가 됩니다.

함수를 생성하려면 인수 유형 및 반환 유형에 대한 `USAGE` 권한이 있어야 합니다.

`SQL` 함수는 하나 이상의 `SQL` 문을 재사용 가능하고 호출 가능한 단위로 래핑합니다. 함수를 사용하여 공통 표현식 또는 계산을 중앙 집중화하고, 여러 쿼리에 일관된 로직을 적용하고, 동일한 `SQL`을 반복하는 대신 단일 함수를 직접적으로 호출하여 애플리케이션 코드를 단순화합니다.

## 파라미터
<a name="create-function-parameters"></a>

**{{이름}}**  
생성할 함수의 이름(선택적으로 스키마 한정자 포함)입니다.

**{{argmode}}**  
인수의 모드: `IN`, `OUT`, `INOUT` 또는 `VARIADIC`. 생략하면 기본값은 `IN`입니다. `VARIADIC`은 마지막 입력 파라미터여야 하며, `OUT` 인수만이 이를 따를 수 있습니다. `OUT` 및 `INOUT` 인수는 `RETURNS TABLE` 표기법과 결합할 수 없습니다.

**{{argname}}**  
인수의 이름입니다. SQL 함수에서는 함수 본문에서 이름별로 인수를 참조할 수 있습니다. 결과 행 유형에서 해당 열 이름을 정의하므로 `OUT` 또는 `INOUT` 인수의 이름도 중요합니다.

**{{argtype}}**  
인수의 데이터 형식입니다. Aurora DSQL 지원 기본 유형, 배열 유형 또는 도메인일 수 있습니다. 자세한 내용은 섹션을 참조하세요[Aurora DSQL에서 지원되는 데이터 유형](working-with-postgresql-compatibility-supported-data-types.md) `%TYPE` 표기법을 사용하여 기존 테이블 열의 유형을 참조할 수도 있습니다.

**{{default\_expr}}**  
인수가 지정되지 않은 경우 기본값으로 사용할 표현식입니다. 표현식은 파라미터의 인수 유형과 강제되어야 합니다. `IN` 및 `INOUT` 인수만 기본값을 가질 수 있습니다. 기본값이 있는 인수 뒤에 오는 각 인수에도 기본값이 있어야 합니다.

**{{rettype}}**  
반환 데이터 형식입니다. Aurora DSQL 지원 기본 유형, 배열 유형 또는 도메인일 수 있습니다. 자세한 내용은 섹션을 참조하세요[Aurora DSQL에서 지원되는 데이터 유형](working-with-postgresql-compatibility-supported-data-types.md) 행 집합을 반환하려면 `SETOF {{rettype}}` 또는 `RETURNS TABLE`을 사용합니다. 함수가 값을 반환하지 않아야 하는 경우 `void`를 반환 유형으로 지정합니다. `OUT` 또는 `INOUT` 파라미터가 있는 경우 `RETURNS` 절을 생략할 수 있으며 함수는 `record` 또는 해당 행 유형을 반환합니다.

**`RETURNS TABLE ( {{column_name}} {{column_type}} [, ...] )`**  
함수가 명명된 열과 유형이 있는 행 세트를 반환하도록 지정합니다. 이는 하나 이상의 `OUT` 파라미터를 선언하고 `SETOF`를 반환 유형으로 지정하는 것과 같습니다.

**`LANGUAGE sql`**  
함수를 구현하는 데 사용되는 언어입니다. Aurora DSQL에서 이 값은 `sql`이어야 합니다. `LANGUAGE` 절을 생략하고 `BEGIN ATOMIC` 또는 `RETURN` 본문을 제공하는 경우 `sql`이 가정됩니다. 문자열 상수 본문(`AS '{{definition}}'`)에는 명시적 `LANGUAGE sql` 절이 필요하며, 생략하면 `no language specified` 오류가 발생하여 실패합니다.

**`IMMUTABLE` / `STABLE` / `VOLATILE`**  
이러한 속성은 쿼리 최적화 프로그램에 함수의 동작에 대해 알립니다. 최대 1개까지 지정할 수 있습니다. 세 가지를 모두 생략하면 함수의 기본값은 `VOLATILE`입니다.  
+ `IMMUTABLE`은 함수가 데이터베이스를 수정할 수 없음을 나타내며 동일한 인수 값이 주어지면 항상 동일한 결과를 반환합니다.
+ `STABLE`은 함수가 데이터베이스를 수정할 수 없음을 나타냅니다. 단일 테이블 스캔 내에서 동일한 인수 값에 대해 동일한 결과를 일관되게 반환하지만 SQL 문 간에 결과가 변경될 수 있습니다.
+ `VOLATILE`은 단일 테이블 스캔 내에서도 함수 값이 변경될 수 있으므로 최적화할 수 없음을 나타냅니다.

**`CALLED ON NULL INPUT` / `RETURNS NULL ON NULL INPUT` / `STRICT`**  
`CALLED ON NULL INPUT`(기본값)은 일부 인수가 null일 때 함수가 정상적으로 호출됨을 나타냅니다. `RETURNS NULL ON NULL INPUT` 또는 `STRICT`는 인수가 null일 때 함수가 항상 null을 반환함을 나타냅니다. 지정된 경우 인수가 null이면 Aurora DSQL이 함수를 실행하지 않고 대신 함수는 자동으로 null을 반환합니다.

**`[ EXTERNAL ] SECURITY INVOKER` / `[ EXTERNAL ] SECURITY DEFINER`**  
`SECURITY INVOKER`(기본값)는 함수를 호출하는 사용자의 권한으로 함수를 실행해야 함을 나타냅니다. `SECURITY DEFINER`는 함수를 소유한 사용자의 권한으로 함수를 실행하도록 지정합니다. `EXTERNAL` 키워드는 SQL 적합성에 허용되지만 선택 사항입니다.

**`PARALLEL { UNSAFE | RESTRICTED | SAFE }`**  
Aurora DSQL은 `PARALLEL` 표시를 수락하고 저장합니다. 그러나 이 표시는 쿼리 실행에 영향을 주지 않습니다.

**`COST {{execution_cost}}`**  
함수의 예상 실행 비용을 제공하는 양수입니다. 함수가 세트를 반환하는 경우 이 값은 반환된 행당 예상 비용입니다. 쿼리 플래너는 함수를 인라인으로 처리하지 않을 때 이 추정치를 사용합니다.

**`ROWS {{result_rows}}`**  
쿼리 플래너가 함수가 반환할 것으로 예상해야 하는 예상 행 수를 나타내는 양수입니다. 이는 함수가 집합을 반환하도록 선언된 경우에만 허용됩니다. 기본 가정은 1000행입니다.

**`SET {{configuration_parameter}} { TO {{value}} | = {{value}} | FROM CURRENT }`**  
`SET` 절은 함수를 입력할 때 지정된 구성 파라미터를 지정된 값으로 설정한 다음 함수가 종료될 때 이전 값으로 복원합니다. `SET FROM CURRENT`는 `CREATE FUNCTION`이 실행될 때의 파라미터 값을 함수를 입력할 때 적용할 값으로 저장합니다.

**`AS '{{definition}}'`**  
함수를 정의하는 문자열 상수이며, 의미는 언어에 따라 다릅니다. SQL 언어 함수의 경우 함수 본문을 구성하는 SQL 문입니다.

**`RETURN {{expression}}`**  
단일 표현식을 반환하는 함수에 대해 SQL 표준 구문을 사용하여 함수 본문을 정의합니다. 이는 문자열 상수 형식의 대안입니다.

**`BEGIN ATOMIC {{statement}}; [ ... ] END`**  
SQL 표준 구문을 사용하여 함수 본문을 정의합니다. 본문은 하나 이상의 SQL 문으로 구성됩니다. 이 양식은 `LANGUAGE sql`에만 유효합니다. 원자성 본문의 문은 함수의 종속성으로 추적됩니다. 예를 들어 본문에서 참조되는 테이블은 함수를 삭제하거나 `DROP ... CASCADE`를 사용하지 않고 삭제할 수 없습니다.

## 참고
<a name="create-function-notes"></a>

`DROP FUNCTION` 문을 사용하여 함수를 제거합니다. `GRANT` 및 `REVOKE`(예: `REVOKE ALL ON FUNCTION`)를 사용하여 함수에 대한 권한을 부여하고 취소할 수도 있습니다.

테이블의 데이터를 읽거나 수정하는 모든 함수에는 동등한 SQL 문이 직접 실행되는 것과 동일한 트랜잭션 및 동시성 동작이 적용됩니다. `IMMUTABLE` 또는 `STABLE`로 선언된 함수는 데이터베이스를 수정해서는 안 됩니다.

기존 함수의 정의를 업데이트하려면 `CREATE OR REPLACE FUNCTION`을 사용합니다. 이러한 방식으로 인수 유형을 변경하거나 함수 유형을 반환할 수 없습니다. 대신 함수를 삭제하고 다시 생성합니다.

함수의 이름을 바꾸거나, 소유자를 변경하거나, 다른 스키마로 이동하려면 `ALTER FUNCTION`을 사용합니다. 다른 속성을 변경하려면 원하는 변경 사항과 함께 `CREATE OR REPLACE FUNCTION`을 사용합니다. 자세한 내용은 [`ALTER FUNCTION`](alter-function-syntax-support.md) 섹션을 참조하세요.

함수 오버로딩이 지원됩니다. 입력 인수 유형이 다른 한 동일한 이름으로 여러 함수를 정의할 수 있습니다. 사용자 정의 함수는 다른 함수를 호출할 수도 있으며 동일한 이름 및 인수 유형의 내장 함수를 섀도우할 수 있습니다.

본문에 문이 두 개 이상 포함된 집합(`SETOF` 또는 `RETURNS TABLE`)을 반환하는 함수의 경우 최종 문 결과만 반환됩니다. 함수는 여전히 이전 문을 실행하지만 결과를 무시합니다. 이는 SQL 언어 함수의 표준 동작입니다. 최종 문이 전체 결과 세트를 생성하도록 함수를 구성합니다.

집합 반환 함수는 특정 행 순서를 보장하지 않습니다. 행 순서를 제어하려면 쿼리에 `ORDER BY` 절을 포함합니다.

## 고려 사항
<a name="create-function-considerations"></a>

다음 `CREATE FUNCTION` 기능은 표시된 오류를 반환합니다.

**`LEAKPROOF`**  
`only superuser can define a leakproof function` 오류를 반환합니다. `NOT LEAKPROOF`(기본값)가 수락됩니다.

**`TRANSFORM FOR TYPE`**  
`transform for type {{type}} language "sql" does not exist` 오류를 반환합니다.

**`SUPPORT`(플래너 지원 함수)**  
`function {{name}}(internal) does not exist` 오류를 반환합니다.

**복합 유형을 반환하는 함수를 포함한 사용자 정의 복합 유형(`CREATE TYPE ... AS`)**  
`unsupported statement: CompositeType` 오류를 반환합니다.

Aurora DSQL은 `PROCEDURE is not supported` 오류와 함께 실패하는 `CREATE PROCEDURE`를 지원하지 않습니다.

`WINDOW` 속성은 구문적으로 허용되지만 SQL 언어 함수에는 유용하지 않습니다. 이 속성을 사용하지 마세요.

## 예제
<a name="create-function-examples"></a>

문자열 상수 본문을 사용하여 두 정수를 추가하는 간단한 SQL 함수를 생성합니다.

```
CREATE FUNCTION add(integer, integer) RETURNS integer
    AS 'SELECT $1 + $2;'
    LANGUAGE sql
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;
```

SQL 표준 `RETURN` 본문과 명명된 인수를 사용하여 동일한 함수를 생성합니다.

```
CREATE FUNCTION add(a integer, b integer) RETURNS integer
    LANGUAGE sql
    IMMUTABLE
    RETURN a + b;
```

`RETURNS TABLE` 및 `BEGIN ATOMIC` 본문을 사용하여 행 집합을 반환하는 함수를 생성합니다.

```
CREATE FUNCTION employees_in_dept(dept_id integer)
    RETURNS TABLE (id integer, name text)
    LANGUAGE sql
    STABLE
    BEGIN ATOMIC
        SELECT id, name FROM employees WHERE department_id = dept_id;
    END;
```

소유자의 권한으로 실행되는 함수를 생성하고 호출 기간 동안 구성 파라미터를 설정합니다.

```
CREATE FUNCTION current_department() RETURNS text
    LANGUAGE sql
    STABLE
    SECURITY DEFINER
    SET search_path = app
    AS 'SELECT current_setting(''app.department'');';
```

## 호환성
<a name="create-function-compatibility"></a>

`CREATE FUNCTION` 명령은 SQL 표준에 정의되어 있습니다. PostgreSQL 구현은 호환되는 방식으로 사용할 수 있지만 확장이 많습니다. 반대로 SQL 표준은 PostgreSQL에서 구현되지 않은 여러 선택적 기능을 지정합니다.

다음은 중요한 호환성 문제입니다.
+ `OR REPLACE`는 PostgreSQL 확장입니다.
+ 일부 다른 데이터베이스 시스템과의 호환성을 위해 {{argmode}}는 {{argname}} 이전 또는 이후에 작성할 수 있습니다. 그러나 첫 번째 방법은 표준 준수입니다.
+ 파라미터 기본값의 경우 SQL 표준은 `DEFAULT` 키워드가 있는 구문만 지정합니다. `=`이 포함된 구문은 T-SQL 및 Firebird에서 사용됩니다.
+ `SETOF` 수정자는 PostgreSQL 확장입니다.
+ SQL만 언어로 표준화됩니다.
+ `CALLED ON NULL INPUT` 및 `RETURNS NULL ON NULL INPUT`을 제외한 다른 모든 속성은 표준화되지 않습니다.
+ `LANGUAGE sql` 함수 본문의 경우 SQL 표준은 {{sql\_body}} 양식만 지정합니다.

단순 `LANGUAGE sql` 함수는 표준 준수 및 다른 구현에 이식 가능한 방식으로 작성할 수 있습니다. 고급 기능, 최적화 속성 또는 기타 언어를 사용하는 보다 복잡한 함수는 중요한 방식으로 PostgreSQL에만 해당됩니다.