CREATE FUNCTION
CREATE FUNCTION은 새 함수를 정의합니다.
중요
Amazon Aurora DSQL에서 CREATE FUNCTION은 SQL 언어 함수(LANGUAGE sql)만 지원합니다.
지원되는 구문
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
설명
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을 반복하는 대신 단일 함수를 직접적으로 호출하여 애플리케이션 코드를 단순화합니다.
파라미터
이름-
생성할 함수의 이름(선택적으로 스키마 한정자 포함)입니다.
argmode-
인수의 모드:
IN,OUT,INOUT또는VARIADIC. 생략하면 기본값은IN입니다.VARIADIC은 마지막 입력 파라미터여야 하며,OUT인수만이 이를 따를 수 있습니다.OUT및INOUT인수는RETURNS TABLE표기법과 결합할 수 없습니다. argname-
인수의 이름입니다. SQL 함수에서는 함수 본문에서 이름별로 인수를 참조할 수 있습니다. 결과 행 유형에서 해당 열 이름을 정의하므로
OUT또는INOUT인수의 이름도 중요합니다. argtype-
인수의 데이터 형식입니다. Aurora DSQL 지원 기본 유형, 배열 유형 또는 도메인일 수 있습니다. 자세한 내용은 섹션을 참조하세요Aurora DSQL에서 지원되는 데이터 유형
%TYPE표기법을 사용하여 기존 테이블 열의 유형을 참조할 수도 있습니다. default_expr-
인수가 지정되지 않은 경우 기본값으로 사용할 표현식입니다. 표현식은 파라미터의 인수 유형과 강제되어야 합니다.
IN및INOUT인수만 기본값을 가질 수 있습니다. 기본값이 있는 인수 뒤에 오는 각 인수에도 기본값이 있어야 합니다. rettype-
반환 데이터 형식입니다. Aurora DSQL 지원 기본 유형, 배열 유형 또는 도메인일 수 있습니다. 자세한 내용은 섹션을 참조하세요Aurora DSQL에서 지원되는 데이터 유형 행 집합을 반환하려면
SETOF또는rettypeRETURNS TABLE을 사용합니다. 함수가 값을 반환하지 않아야 하는 경우void를 반환 유형으로 지정합니다.OUT또는INOUT파라미터가 있는 경우RETURNS절을 생략할 수 있으며 함수는record또는 해당 행 유형을 반환합니다. RETURNS TABLE (column_namecolumn_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표시를 수락하고 저장합니다. 그러나 이 표시는 쿼리 실행에 영향을 주지 않습니다. COSTexecution_cost-
함수의 예상 실행 비용을 제공하는 양수입니다. 함수가 세트를 반환하는 경우 이 값은 반환된 행당 예상 비용입니다. 쿼리 플래너는 함수를 인라인으로 처리하지 않을 때 이 추정치를 사용합니다.
ROWSresult_rows-
쿼리 플래너가 함수가 반환할 것으로 예상해야 하는 예상 행 수를 나타내는 양수입니다. 이는 함수가 집합을 반환하도록 선언된 경우에만 허용됩니다. 기본 가정은 1000행입니다.
SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT }-
SET절은 함수를 입력할 때 지정된 구성 파라미터를 지정된 값으로 설정한 다음 함수가 종료될 때 이전 값으로 복원합니다.SET FROM CURRENT는CREATE FUNCTION이 실행될 때의 파라미터 값을 함수를 입력할 때 적용할 값으로 저장합니다. AS 'definition'-
함수를 정의하는 문자열 상수이며, 의미는 언어에 따라 다릅니다. SQL 언어 함수의 경우 함수 본문을 구성하는 SQL 문입니다.
RETURNexpression-
단일 표현식을 반환하는 함수에 대해 SQL 표준 구문을 사용하여 함수 본문을 정의합니다. 이는 문자열 상수 형식의 대안입니다.
BEGIN ATOMICstatement; [ ... ] END-
SQL 표준 구문을 사용하여 함수 본문을 정의합니다. 본문은 하나 이상의 SQL 문으로 구성됩니다. 이 양식은
LANGUAGE sql에만 유효합니다. 원자성 본문의 문은 함수의 종속성으로 추적됩니다. 예를 들어 본문에서 참조되는 테이블은 함수를 삭제하거나DROP ... CASCADE를 사용하지 않고 삭제할 수 없습니다.
참고
DROP FUNCTION 문을 사용하여 함수를 제거합니다. GRANT 및 REVOKE(예: REVOKE ALL ON FUNCTION)를 사용하여 함수에 대한 권한을 부여하고 취소할 수도 있습니다.
테이블의 데이터를 읽거나 수정하는 모든 함수에는 동등한 SQL 문이 직접 실행되는 것과 동일한 트랜잭션 및 동시성 동작이 적용됩니다. IMMUTABLE 또는 STABLE로 선언된 함수는 데이터베이스를 수정해서는 안 됩니다.
기존 함수의 정의를 업데이트하려면 CREATE OR REPLACE
FUNCTION을 사용합니다. 이러한 방식으로 인수 유형을 변경하거나 함수 유형을 반환할 수 없습니다. 대신 함수를 삭제하고 다시 생성합니다.
함수의 이름을 바꾸거나, 소유자를 변경하거나, 다른 스키마로 이동하려면 ALTER
FUNCTION을 사용합니다. 다른 속성을 변경하려면 원하는 변경 사항과 함께 CREATE OR REPLACE FUNCTION을 사용합니다. 자세한 내용은 ALTER FUNCTION 섹션을 참조하세요.
함수 오버로딩이 지원됩니다. 입력 인수 유형이 다른 한 동일한 이름으로 여러 함수를 정의할 수 있습니다. 사용자 정의 함수는 다른 함수를 호출할 수도 있으며 동일한 이름 및 인수 유형의 내장 함수를 섀도우할 수 있습니다.
본문에 문이 두 개 이상 포함된 집합(SETOF 또는 RETURNS TABLE)을 반환하는 함수의 경우 최종 문 결과만 반환됩니다. 함수는 여전히 이전 문을 실행하지만 결과를 무시합니다. 이는 SQL 언어 함수의 표준 동작입니다. 최종 문이 전체 결과 세트를 생성하도록 함수를 구성합니다.
집합 반환 함수는 특정 행 순서를 보장하지 않습니다. 행 순서를 제어하려면 쿼리에 ORDER BY 절을 포함합니다.
고려 사항
다음 CREATE FUNCTION 기능은 표시된 오류를 반환합니다.
LEAKPROOF-
only superuser can define a leakproof function오류를 반환합니다.NOT LEAKPROOF(기본값)가 수락됩니다. TRANSFORM FOR TYPE-
transform for type오류를 반환합니다.typelanguage "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 언어 함수에는 유용하지 않습니다. 이 속성을 사용하지 마세요.
예제
문자열 상수 본문을 사용하여 두 정수를 추가하는 간단한 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'');';
호환성
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에만 해당됩니다.