PostgreSQL 9.6.2 문서 | |||
---|---|---|---|
이전 | 위로 | 장 41. PL/pgSQL - SQL 프로시저 언어 | 다음 |
PL/pgSQL은 PostgreSQL 데이터베이스 시스템에서 로드가능한 프로시저 언어다. PL/pgSQL의 설계 목적은 다음과 같은 특징을 가지는 로드가능한 절차적 언어다.
함수와 트리거 프로시저를 만들기 위해 사용할수 있다.
SQL 언어에 제어 구조를 추가한다.
복잡한 연산을 할 수 있다.
모든 사용자정의 타입, 함수, 연산자를 상속한다.
서버가 신뢰할수 있게 정의할 수 있다.
사용하기 쉽다.
PL/pgSQL로 만든 함수는 내장 함수가 사용될 수 있는 곳이라면 어디에서든 사용할 수 있다. 예를들어, 복잡한 조건을 처리하는 함수를 만들고, 그 함수를 나중에 연산자를 정의하거나 인덱스 표현에서 사용할 수 있다.
PostgreSQL 9.0 이후 버전에서, PL/pgSQL은 기본으로 설치된다. 하지만 여전히 로드가능한 모듈이라서, 보안을 엄격하게 생각하는 관리자는 PL/pgSQL을 제거할 수 있다.
SQL은 PostgreSQL과 대부분의 다른 관계형 데이터베이스에서 질의 언어로 사용하는 언어다. SQL은 배우기 쉽긴 하지만, 모든 SQL 구문은 데이터베이스 서버에서 반드시 구문마다 개별적으로 실행된다.
다시 말하자면 클라이언트 애플리케이션은 데이터베이스 서버에 반드시 쿼리를 개별적으로 보내고, 각 쿼리가 처리될때까지 기다린 다음 결과를 받아서 연산을 한 후에 다음 쿼리를 서버로 보낸다. 이런 과정들은 내부 처리 과정을 발생시키고, 데이터베이스와 클라이언트가 다른 장비에 있다면 네트워크 부하도 일으킨다.
PL/pgSQL은 절차적 언어의 기능을 가지고 있고 SQL을 사용하기 쉽기때문에, 데이터베이스 서버 내부 에서의 쿼리와 연산을 그룹화할수 있고, 클라이언트/서버 통신 부하를 절약할 수 있다.
클라이언트와 서버간의 불필요한 통신을 제거한다.
클라이언트가 불필요한 중간 결과물들을 가지고 있거나 서버/클라이언트간에 전송하지 않아도 된다.
불필요한 쿼리 처리를 하지 않아도 된다.
이런 요소들때문에 저장 함수들을 이용하지 않는 애플리케이션보다 성능 향상을 기대할 수 있다.
또한, PL/pgSQL은 SQL의 모든 데이터 자료형, 연산, 함수를 이용할 수 있다.
PL/pgSQL에서 작성된 함수는 서버에서 지원하는 스칼라나 배열 자료형을 매개변수로 받을수 있다. 또한, 이름으로 지정된 복합 타입(로우 타입)을 받거나 반환할 수 있다. 7.2.1.4절에 나온것 처럼 쿼리 호출에서 명시된대로 컬럼들의 로우 타입 결과인 레코드를 반환하도록 PL/pgSQL 함수를 선언할 수 있다.
36.4.5절. PL/pgSQL 함수는 VARIADIC 지시자를 이용해서 여러개의 매개변수를 선언할 수 있다. 이것은 36.4.5절에 나온것과 같이 SQL함수와 같은 방법으로 작동한다.
PL/pgSQL 함수는 모든 원소, 모든 배열, 모든 비배열, 모든 열거형의 다양한 형식을 입력받고 반환할 수 있다. 다형성 함수가 실제로 다루는 자료형들은 36.2.5절에서 나온것 처럼 호출에서 호출까지 다양할수 있다. 예제는 41.3.1절에 나온다.
PL/pgSQL 함수는 단일 인스턴스로 반환가능한 어떤 자료형이든지 "집합" (또는 테이블)을 반환하도록 선언될 수 있다. 그런 함수는 결과 집합으로 선언된 각 원소를 위해 RETURN NEXT를 실행함으로써 출력을 생성한다. 또는 쿼리 수행 결과를 출력하기위해 RETURN QUERY를 이용한다.
마지막으로, PL/pgSQL 함수는 결과 반환값이 없으면 void를 반환하도록 선언될 수 있다.
PL/pgSQL 함수는 반환형으로 지정된 형식 대신에 매개변수를 출력하도록 선언될 수 있다. 이것은 언어에 함수적인 기능을 추가하지 않지만, 종종 편리할 때가 있다. 특히, 여러개의 결과를 반환할때 유용하다. RETURNS TABLE 기호는 RETURNS SETOF 위치에 사용될 수 있다.