CREATE PROCEDURE
CREATE PROCEDURE
새 프로시저(procedure)를 정의하는 명령이에요. 함수와 달리 트랜잭션 제어를 다룰 수 있는 절차적 코드 블록을 만들 때 사용합니다.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
CREATE [ OR REPLACE ] PROCEDURE
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
| sql_body
} ...
설명 (Description)
CREATE PROCEDURE는 새 프로시저를 정의해요. CREATE OR REPLACE PROCEDURE는 새 프로시저를 만들거나 기존 정의를 교체합니다. 프로시저를 정의하려면 사용자에게 그 언어에 대한 USAGE 권한이 있어야 해요.
스키마 이름이 포함되면 그 스키마에 프로시저가 만들어지고, 아니면 현재 스키마에 만들어집니다. 새 프로시저의 이름은 같은 스키마에서 같은 입력 인자 타입을 가진 기존 프로시저나 함수와 같으면 안 돼요. 다만 인자 타입이 다른 프로시저와 함수는 이름을 공유할 수 있습니다(이를 오버로딩이라고 해요).
기존 프로시저의 현재 정의를 교체하려면 CREATE OR REPLACE PROCEDURE를 사용하세요. 이렇게 해서 프로시저의 이름이나 인자 타입을 바꿀 수는 없습니다. (그렇게 시도하면 실제로는 새롭고 별개의 프로시저를 만드는 셈이에요.)
CREATE OR REPLACE PROCEDURE로 기존 프로시저를 교체할 때 프로시저의 소유권과 권한은 바뀌지 않아요. 다른 프로시저 속성은 모두 명령에서 지정되거나 암시된 값으로 지정됩니다. 프로시저를 교체하려면 그 프로시저를 소유해야 합니다(소유 역할의 구성원인 것도 포함).
프로시저를 만든 사용자가 그 프로시저의 소유자가 됩니다.
프로시저를 만들려면 인자 타입에 대한 USAGE 권한이 있어야 해요.
프로시저 작성에 대한 더 자세한 내용은 36.4절을 참고하세요.
파라미터 (Parameters)
name— 만들 프로시저의 이름(스키마 한정 가능).argmode— 인자의 모드:IN,OUT,INOUT,VARIADIC. 생략하면 기본은IN이에요.argname— 인자의 이름.argtype— 프로시저 인자의 데이터 타입(들)(스키마 한정 가능). 인자 타입은 기본(base), 복합(composite), 도메인 타입이거나 테이블 컬럼의 타입을 가리킬 수 있어요. 구현 언어에 따라cstring같은 '의사 타입(pseudo-type)' 지정도 허용될 수 있습니다. 의사 타입은 실제 인자 타입이 완전히 지정되지 않았거나 일반 SQL 데이터 타입의 집합 밖임을 나타내요. 컬럼 타입은table_name.column_name%TYPE으로 써서 참조합니다. 이 기능을 쓰면 프로시저가 테이블 정의 변경과 무관해지는 데 도움이 될 때가 있습니다.default_expr— 파라미터가 지정되지 않았을 때 기본값으로 쓸 표현식. 그 표현식은 파라미터의 인자 타입으로 강제 변환(coercible) 가능해야 해요. 기본값이 있는 파라미터 뒤에 오는 모든 입력 파라미터도 기본값을 가져야 합니다.lang_name— 프로시저가 구현된 언어의 이름.sql,c,internal또는plpgsql같은 사용자 정의 절차적 언어의 이름일 수 있어요.sql_body를 지정하면 기본은sql입니다. 이름을 작은따옴표로 감싸는 것은 폐기 예정이며 대소문자를 정확히 맞춰야 해요.TRANSFORM { FOR TYPE type_name } [, ... ]— 프로시저 호출에 적용해야 할 변환을 나열해요. 변환은 SQL 타입과 언어별 데이터 타입 사이를 변환합니다(see CREATE TRANSFORM). 절차적 언어 구현은 보통 내장 타입을 하드코딩으로 알고 있어서 여기에 나열할 필요가 없습니다. 절차적 언어 구현이 어떤 타입을 다루는 법을 모르고 변환도 제공되지 않으면 데이터 타입 변환을 위한 기본 동작으로 빠지는데, 이는 구현에 따라 달라요.[EXTERNAL] SECURITY INVOKER/[EXTERNAL] SECURITY DEFINER—SECURITY INVOKER는 프로시저가 호출한 사용자의 권한으로 실행돼야 함을 나타내며 그것이 기본이에요.SECURITY DEFINER는 프로시저가 그 소유자의 권한으로 실행돼야 함을 지정합니다.EXTERNAL키워드는 SQL 적합성을 위해 허용되지만, SQL과 달리 이 기능이 모든 프로시저에 적용되므로 선택사항이에요.SECURITY DEFINER프로시저는 트랜잭션 제어 문(예: 언어에 따라COMMIT,ROLLBACK)을 실행할 수 없습니다.SET configuration_parameter { TO value | = value | FROM CURRENT }—SET절은 프로시저에 들어갈 때 지정한 구성 파라미터를 지정한 값으로 설정하고, 프로시저가 끝날 때 이전 값으로 복원되게 해요.SET FROM CURRENT는CREATE PROCEDURE실행 시점에 현재인 파라미터 값을, 프로시저에 들어갈 때 적용될 값으로 저장합니다. 프로시저에SET절이 붙어 있으면, 프로시저 안에서 같은 변수에 대해 실행된SET LOCAL명령의 효과는 프로시저로 제한돼요. 즉 구성 파라미터의 이전 값이 여전히 프로시저 종료 시에 복원됩니다. 하지만LOCAL없는 일반SET명령은 이전SET LOCAL명령에서처럼SET절을 덮어써요. 그런 명령의 효과는 현재 트랜잭션이 롤백되지 않는 한 프로시저 종료 후에도 지속됩니다. 프로시저에SET절이 붙어 있으면 그 프로시저는 트랜잭션 제어 문(예: 언어에 따라COMMIT,ROLLBACK)을 실행할 수 없어요. 허용되는 파라미터 이름과 값에 대한 자세한 내용은 SET와 19장을 참고하세요.AS 'definition'— 프로시저를 정의하는 문자열 상수. 의미는 언어에 달려 있어요. 내부 프로시저 이름, 객체 파일 경로, SQL 명령, 또는 절차적 언어로 된 텍스트일 수 있습니다. 일반 작은따옴표 문법보다 달러 따옴표(dollar quoting, 4.1.2.4절 참고)로 프로시저 정의 문자열을 쓰는 게 도움이 될 때가 많아요. 달러 따옴표를 안 쓰면 프로시저 정의 안의 작은따옴표나 백슬래시를 두 배로 늘려 이스케이프해야 합니다.AS 'obj_file', 'link_symbol'— 이 형태의AS절은 C 언어 소스의 프로시저 이름이 SQL 프로시저의 이름과 다를 때 동적으로 로드되는 C 언어 프로시저에 쓰여요.obj_file문자열은 컴파일된 C 프로시저를 담은 공유 라이브러리 파일의 이름이며LOAD명령에서처럼 해석됩니다.link_symbol문자열은 프로시저의 링크 심볼, 즉 C 언어 소스의 프로시저 이름이에요. 링크 심볼을 생략하면 정의되는 SQL 프로시저의 이름과 같다고 가정합니다. 반복된CREATE PROCEDURE호출이 같은 객체 파일을 가리키면 그 파일은 세션당 한 번만 로드됩니다. 파일을 내렸다가 다시 올리려면(예를 들어 개발 중에) 새 세션을 시작하세요.sql_body—LANGUAGE SQL프로시저의 본문. 이는 블록statement ...이어야 해요. 프로시저 본문 텍스트를 문자열 상수로 쓰는 것(위의definition참고)과 비슷하지만 몇 가지 차이가 있어요. 이 형태는LANGUAGE SQL에서만 동작하고, 문자열 상수 형태는 모든 언어에서 동작합니다. 이 형태는 프로시저 정의 시점에 파싱되고, 문자열 상수 형태는 실행 시점에 파싱돼요. 따라서 이 형태는 다형성(polymorphic) 인자 타입이나 프로시저 정의 시점에 해석할 수 없는 다른 구조를 지원하지 못합니다. 이 형태는 프로시저와 프로시저 본문에서 쓰는 객체 사이의 의존성을 추적해서DROP ... CASCADE가 올바르게 동작하는 반면, 문자열 리터럴 형태는 매달린(dangling) 프로시저를 남길 수 있어요. 마지막으로 이 형태는 SQL 표준과 다른 SQL 구현과 더 호환됩니다.
주의 사항 (Notes)
함수 생성에 대한 더 자세한 내용은 프로시저에도 적용되는 CREATE FUNCTION을 참고하세요.
프로시저를 실행하려면 CALL을 사용하세요.
예제 (Examples)
CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;
또는
CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
BEGIN ATOMIC
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
END;
그리고 이렇게 호출합니다:
CALL insert_data(1, 2);
호환성 (Compatibility)
CREATE PROCEDURE 명령은 SQL 표준에 정의되어 있어요. PostgreSQL 구현은 호환 가능한 방식으로 쓸 수 있지만 확장 기능이 많습니다. 자세한 내용은 CREATE FUNCTION도 참고하세요.
함께 보기 (See Also)
ALTER PROCEDURE, DROP PROCEDURE, CALL, CREATE FUNCTION
더 알아보기 (Learn more)
CALL: 프로시저를 실행하는 명령.CREATE FUNCTION: 프로시저와 유사하지만 값을 반환하는 함수를 정의하는 명령.