PL/pgSQL 표현식

PL/pgSQL 표현식 (Expressions)

PL/pgSQL 문장에서 쓰는 모든 표현식은 서버의 메인 SQL 실행기가 처리해요. 예를 들어 IF expression THEN ... 같은 문장을 쓰면, PL/pgSQL은 SELECT expression 형태의 질의를 메인 SQL 엔진에 넘겨서 평가해요. 이렇게 동작하기 때문에 어떤 재미있는 성질이 생기는데, 그 내부 동작을 살짝 들여다볼게요.

출처: 공식문서

표현식은 SELECT로 변환된다

IF x < y THEN ... 같은 문장을 쓰면, PL/pgSQL은 PL/pgSQL 변수 이름을 쿼리 파라미터로 바꿔치기해요. 예를 들어 정수 변수 x, y가 선언되어 있을 때, 내부적으로는 이런 준비된 문장이 만들어져요.

PREPARE statement_name (integer, integer) AS SELECT $1 < $2;

그리고 IF 문장이 실행될 때마다 그 준비된 문장을 현재 변수 값들을 파라미터 값으로 넣어 EXECUTE해요. 덕분에 SELECT에 대한 쿼리 플랜이 한 번만 만들어지고, 이후에는 변수 값만 바꿔가며 같은 플랜을 재사용할 수 있어요. 즉 표현식을 처음 쓸 때 실제로 일어나는 일은 본질적으로 PREPARE 명령이라고 보면 돼요.

평소에는 이런 세부 사항이 중요하지 않지만, 문제를 진단할 때는 알고 있으면 도움이 돼요.

SELECT처럼 쓸 수 있다

표현식이 SELECT 명령으로 변환되므로, 일반 SELECT가 쓸 수 있는 절들을 대부분 쓸 수 있어요. 다만 최상위에 UNION, INTERSECT, EXCEPT 절은 쓸 수 없어요.

예를 들어 테이블이 비어 있지 않은지 테스트할 때 이렇게 쓸 수 있어요.

IF count(*) > 0 FROM my_table THEN ...

여기서 IFTHEN 사이의 표현식은 SELECT count(*) > 0 FROM my_table로 해석되기 때문이에요. 이때 SELECT는 단일 컬럼을 만들어야 하고, 한 행을 넘겨서는 안 돼요. 행이 없으면 결과는 NULL로 처리돼요.

더 알아보기 (Learn more)

  • PL/pgSQL 변수 치환과 쿼리 플랜 재사용에 대한 자세한 설명: Section 41.11.1, Section 41.11.2
  • 표현식을 쓰는 여러 문장: Section 41.5. Basic Statements