PL/pgSQL은 PostgreSQL 데이터베이스를 위한 로드 가능한 절차적 언어입니다. PL/pgSQL은 함수, 프로시저 및 트리거를 만드는 데 사용할 수 있습니다. 그리고 SQL 언어에 제어 구조를 추가하고, 복잡한 계산을 수행할 수 있으며, 모든 사용자 정의 유형, 함수, 프로시저 및 연산자를 동일하게 사용할 수 있습니다.
PL/pgSQL로 만든 함수는 PostgreSQL 내장 함수를 사용할 수 있는 모든 곳에서 사용할 수 있습니다. 예를 들어 복잡한 조건부 계산 함수를 만든 다음 나중에 이를 사용하여 연산자를 정의하거나 인덱스 표현식에서 사용할 수 있습니다.
SQL은 PostgreSQL과 대부분의 다른 관계형 데이터베이스에서 쿼리 언어로 사용하는 언어입니다. 그러나 모든 SQL 문은 데이터베이스 서버에서 개별적으로 실행되어야 합니다.
즉, 클라이언트 프로그램은 각 쿼리를 데이터베이스 서버에 보내고 서버에서 쿼리가 처리될 때까지 기다렸다가 응답 결과를 수신 및 처리하고 일부 계산을 수행한 다음 추가 쿼리를 서버에 보내야 합니다. 이 모든 작업은 프로세스 사이의 통신을 발생시키고, 클라이언트가 데이터베이스 서버와 다른 시스템에 있는 경우 네트워크 오버헤드도 발생합니다.
PL/pgSQL을 사용하면 일련의 쿼리를 그룹화할 수 있으므로 절차적 언어의 성능과 SQL의 사용 용이성을 가지면서도 클라이언트·서버 사이의 통신 오버헤드를 상당히 절약할 수 있습니다. 클라이언트의 추가 쿼리 요청을 생략할 수 있고, 클라이언트가 필요로 하지 않는 중간 결과는 서버가 응답 결과에 포함하지 않아도 됩니다. 또한 PL/pgSQL로 쓰여진 함수나 프로시저는 미리 컴파일되기 때문에 쿼리 구문 분석 과정을 피할 수 있습니다.
이는 저장된 기능을 사용하지 않는 애플리케이션에 비해 상당한 성능 향상을 초래할 수 있습니다.
PL/pgSQL 로 작성된 함수 는 CREATE FUNCTION
명령을 실행하여 서버에 정의됩니다. 함수 정의 형태는 일반적으로 다음과 같습니다.
CREATE OR REPLACE FUNCTION 함수이름 (매개변수이름 자료형, ...)
RETURNS 반환값자료형
LANGUAGE plpgsql
AS $$
DECLARE
변수이름 자료형;
...
BEGIN
statement;
...
END;
$$;
PL/pgSQL은 블록 구조 언어입니다. 함수 본문의 전체 텍스트는 블록이어야 합니다. 블록은 다음과 같이 정의됩니다.
[ <<label>> ]
[ DECLARE
declarations ]
BEGIN
statements
END [ label ];
블록 내의 각 선언 및 각 명령문은 세미콜론으로 종료됩니다. 블록 안에 또다른 블록이 존재할 수 있는데 이를 subblock이라고 합니다. subblock은 위에 표시된 것처럼 END
뒤에 세미콜론이 있어야 합니다.
label
는 EXIT
명령문에서 사용할 블록을 식별하거나 블록에서 선언된 변수의 이름을 한정하려는 경우에만 필요합니다. 레이블이 주어지면 뒤의 END
블록의 레이블과 일치해야 합니다.
모든 키워드는 대소문자를 구분하지 않습니다. 식별자는 일반 SQL 명령과 마찬가지로 큰따옴표로 묶지 않는 한 암시적으로 소문자로 변환됩니다.
PL/pgSQL에서 statement를 그룹화하기 위해 BEGIN
/END
를 사용 하는 것과 트랜잭션 제어에서 사용하는 유사한 이름의 SQL 명령을 혼동하지 않는 것이 중요합니다. PL/pgSQL의 BEGIN
/END
는 그룹화 전용이고, 새로운 트랜잭션을 생성하거나 기존의 트랜잭션을 종료하지 않습니다.