ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PostgreSQL] PL/pgSQL Block Structure
    DB/PostgreSQL 2016. 12. 23. 11:22

    PL/pgSQL 함수는 블럭 구조로 되어있으며 아래와 같은 문법을 따르고 있습니다.

    [ <<label>> ]
    [ DECLARE
        declarations ]
    BEGIN
        statements;
     ...
    END [ label ];


    각 블록에는 declaration과 body라는 두 개의 섹션이 있습니다. body 섹션은 필수적인 반면, declaration 섹션은 선택 사항입니다. 블록은 END 키워드 다음에 세미콜론 (;)으로 끝납니다.

    블록에는 시작과 끝 부분에 추가적인 label이 있을 수 있습니다. 이 label의 처음과 끝은 동일해야합니다. 이 블록 label은 EXIT 문에서 블록을 사용하거나 블록에서 선언 된 변수의 이름을 정규화하려는 경우에 사용됩니다.

    declaration 섹션은 body 섹션에서 사용되는 모든 변수를 선언하는 곳입니다. declaration 섹션의 각 명령문은 세미콜론 (;)으로 끝납니다.

    body 섹션은 블록의 logic을 두는 곳입니다. 유효한 모든 명령문을 포함합니다. ㅠㅐ요 섹션의 각 문은 세미콜론 (;)으로 끝납니다.

    예제

    DO 문은 블록에 속하지 않습니다. DO문은 익명 블록을 실행하는 데 사용됩니다. PostgreSQL에서는 버전 9.0부터 DO 문을 도입했습니다.

    DO $$ 
    <<first_block>>
    DECLARE
      counter integer := 0;
    BEGIN 
       counter := counter + 1;
       RAISE NOTICE 'The current value of counter is %', counter;
    END first_block $$;
     
     
     
    NOTICE:  The current value of counter is 1

    위 예시는 declaration 섹션에서 count라는 변수를 선언하고 값을 0으로 설정했습니다. body 섹션에서 count를 1로 늘리고 RAISE NOTICE 문을 사용하여 값을 출력했습니다. first_block이라는 label은 데모 목적으로만 사용됩니다. 이 예제에서는 아무것도 수행하지 않습니다.

    Subblock

    블록을 다른 블록의 body 안에 넣을 수 있습니다. 다른 블록 안에 중첩된이 블록을 하위 블록이라고합니다. 서브 블록을 포함하는 블록을 외부 블록이라고합니다.

    큰 블록을 더 작은 논리적 서브 블록으로 나눌 수 있도록 명령문을 그룹화하기 위해 종종 서브 블록을 사용합니다. 하위 블록의 변수는 바깥 규칙에있는 변수와 마찬가지로 이름을 가질 수 있습니다.

    외부 블록의 이름과 동일한 이름을 가진 하위 블록 내에서 변수를 정의하면 외부 블록의 변수가 하위 블록에 숨겨집니다. 외부 블록의 변수에 액세스하려면 블록 레이블을 사용하여 해당 이름을 한정합니다.

    DO $$ 
    <<outer_block>>
    DECLARE
      counter integer := 0;
    BEGIN 
       counter := counter + 1;
       RAISE NOTICE 'The current value of counter is %', counter;
     
       DECLARE 
           counter integer := 0;
       BEGIN 
           counter := counter + 10;
           RAISE NOTICE 'The current value of counter in the subblock is %', counter;
           RAISE NOTICE 'The current value of counter in the outer block is %', outer_block.counter;
       END;
     
       RAISE NOTICE 'The current value of counter in the outer block is %', counter;
       
    END outer_block $$;
     
     
    NOTICE:  The current value of counter is 1
    NOTICE:  The current value of counter in the subblock is 10
    NOTICE:  The current value of counter in the outer block is 1
    NOTICE:  The current value of counter in the outer block is 1

    이 예에서는 먼저 outer_block에 counter라는 변수를 선언했습니다. 그런 다음 하위 블록에서 동일한 이름의 변수도 선언했습니다. 그런 다음 하위 블록에 들어가기 전에 counter 값은 1입니다. 하위 블록에서 counter 값을 10으로 늘린 다음이를 인쇄합니다. 변경 사항은 하위 블록의 counter 변수에만 영향을줍니다. 그런 다음 outer_block.counter 이름을 한정하기 위해 블록 label을 사용하여 외부 블록의 counter 변수를 참조했습니다. 마지막으로 바깥 쪽 블록에 값 counter 변수를 출력합니다. 값은 그대로 유지됩니다. 이 튜토리얼에서는 PL/pgSQL의 블록 구조와 DO 문을 사용하여 블록을 실행하는 방법에 대해 배웠다.

    댓글