PostgreSQL 9.6.2 문서 | |||
---|---|---|---|
이전 | 위로 | 장 41. PL/pgSQL - SQL 프로시저 언어 | 다음 |
PL/pgSQL is a block-structured language. The complete text of a function definition must be a block. A block is defined as: PL/pgSQL은 블록구조의 언어다. 함수정의 구조는 block 형태여야 한다. 블록은 아래처럼 정의된다.
[ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ];
블록 내부의 선언과 구문은 세미콜론으로 종료된다. 블록 내부에 나타나는 또 다른 블록은 위에 보이는 것 처럼 반드시 END 다음에 세미콜론이 있어야 한다. 하지만, 함수의 본문을 마무리하는 마지막 END에는 세미콜론이 없어도 된다.
작은 정보: 일반적으로 많이 하는 실수는 BEGIN 다음에 바로 세미콜론을 넣는 것이다. 이 실수 때문에 문법 에러가 발생한다.
label은 EXIT 구문에서 블록을 구분할때나 블록에 선언된 변수의 이름을 구분할때 필요하다. END 다음에 label이 오면 블록의 시작에 거기에 맞는 label이 있어야 한다.
모든 키워드는 대소문자를 구분하지 않는다. 식별자는 일반적인 SQL 명령에서 쓰일때 쌍따옴표가 없으면 기본적으로 소문자로 변경된다.
PL/pgSQL의 주석은 일반적인 SQL 하고 같은 방식으로 작동한다. 대시두개(--)는 거기서부터 그 줄의 끝까지 주석으로 인식하개 한다. /*와 */ 사이에 있는 블록은 주석으로 처리된다.
블록의 구문 부분에 있는 모든 구문은 subblock(하위블록)이 될 수 있다. Subblock(하위블록)은 구문의 논리적인 그룹화나 작은 그룹에 대한 변수를 내부변수화 하는데 사용될 수 있다. 하위블록내부에 선언된 변수들은 바깥 블록에 있는 비슷한 이름의 변수들하고 구분된다. 하지만, 블록의 label을 이용하면 바깥 블록에 있는 변수에 접근할 수 있다. 다음 예제를 보자.
CREATE FUNCTION somefunc() RETURNS integer AS $$ << outerblock >> DECLARE quantity integer := 30; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 30 quantity := 50; -- -- 하위블록 생성 -- DECLARE quantity integer := 80; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 80 RAISE NOTICE 'Outer quantity here is %', outerblock.quantity; -- Prints 50 END; RAISE NOTICE 'Quantity here is %', quantity; -- Prints 50 RETURN quantity; END; $$ LANGUAGE plpgsql;
참고: 모든 PL/pgSQL 함수의 본문에는 본문을 둘러싸는 숨겨진 "outer block(외부블록)"이 존재한다. 이 블록은 함수 매개변수들의 선언을 제공한다. 뿐만아니라, FOUND 같은 일부 특수한 변수도 제공한다. (41.5.5절 참고). 외부블록은 함수의 이름으로 구분되고, 매개변수나 특수변수들은 함수의 이름으로 구분될 수 있다.
트랜잭션 제어를 위한 SQL 명령과 유사하게 PL/pgSQL의 구문들을 그룹핑하기위해 BEGIN/END을 이용해서 혼란을 막는것은 중요한다. PL/pgSQL의 BEGIN/END은 그룹핑 용도일 뿐이다. 트랜잭션을 시작하거나 종료하는게 아니다. 함수와 트리거 프로시져들은 항상 외부쿼리에 의해 만들어진 트랜잭션 내에서 실행된다. — 직접 트랜잭션을 시작하거나 커밋할 수 없다. 그래서 내부에 트랜잭션을 실행하기위한 컨텍스트가 없다. 하지만 블록은 EXCEPTION 구문을 포함하고 있어서, 외부 트랜잭션에 영향을 미치지 않고 롤백될수 있는 하위트랜잭션을 구성할 수 있다. 더 자세한 사항은 41.6.6절을 참고하기 바란다.