PREPARE

PREPARE

미리 준비된 명령문(prepared statement)을 생성하는 명령이에요. 명령문을 파싱·분석·재작성해 서버에 저장한 뒤, 이후 EXECUTE로 그 계획을 실행해 반복 실행의 성능을 최적화하는 데 쓰여요. 준비된 명령문은 현재 데이터베이스 세션 동안만 유지돼요.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

PREPARE name [ ( data_type [, ...] ) ] AS statement

설명 (Description)

PREPARE는 준비된 명령문을 생성해요. 준비된 명령문은 성능 최적화에 사용할 수 있는 서버 측 객체예요. PREPARE가 실행되면 지정된 명령문이 파싱(parsed), 분석(analyzed), 재작성(rewritten)돼요. 나중에 EXECUTE 명령이 실행되면 준비된 명령문이 계획되고(planned) 실행되는데, 이렇게 하면 반복적인 파싱과 분석을 피하면서 플래너가 매번 완전한 자유를 누릴 수 있게 돼요. 준비된 명령문을 어떻게 사용하는지에 대한 자세한 내용은 “Prepare Statements” 절에서 확인할 수 있어요.

준비된 명령문은 현재 데이터베이스 세션의 수명 동안만 지속돼요. 세션이 종료되면 준비된 명령문은 잊혀지므로 재사용하려면 다시 생성해야 해요. 준비된 명령문은 DEALLOCATE 명령으로 삭제할 수도 있어요.

파라미터 (Parameters)

*name* — 이 특정 준비된 명령문에 주는 임의의 이름이에요. 세션 내에서 고유해야 하며 기존 준비된 명령문과 같아서는 안 돼요.

*data_type* — 준비된 명령문이 받아들일 파라미터의 데이터 타입이에요. 준비된 명령문 자체에서 파라미터를 참조하려면 $1, $2 등을 사용하세요.

*statement* — 어떤 SELECT, INSERT, UPDATE, DELETE 또는 MERGE 명령문이든 가능해요.

참고 (Notes)

파라미터에 대한 데이터 타입이 지정되었거나 명령문이 $n 파라미터를 참조하지만 데이터 타입이 지정되지 않은 경우, 타입은 컨텍스트에서 추론돼요(가능할 때). 파라미터 추론은 UNNEST와 같아요. 파라미터가 없는 준비된 명령문을 생성할 때 NOTICE가 표시될 수 있다는 점을 알아두세요.

파라미터가 없는 준비된 명령문을 생성하려면 빈 목록 ()을 사용하면 돼요. 예를 들어:

PREPARE fooplan (int, text, bool, numeric) AS INSERT INTO foo VALUES($1,$2,$3,$4);

준비된 명령문의 인자에서 명명된 표기법(named notation)을 사용하는 것은 허용되지 않아요.

PREPAREEXECUTE에 대한 더 철저한 설명은 “Prepare Statements” 절을 참고하세요.

예제 (Examples)

SELECT를 위한 준비된 명령문을 생성하고 실행하려면:

PREPARE fooplan (int, text, bool, numeric) AS
    INSERT INTO foo VALUES($1,$2,$3,$4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);

기본값을 사용해 INSERT를 위한 준비된 명령문을 생성하고 실행하려면:

PREPARE usrrptplan (int) AS
    SELECT * FROM users u, logs l WHERE usrid = $1 AND date = $1 AND l.usrid = u.usrid;
EXECUTE usrrptplan(1);

호환성 (Compatibility)

SQL 표준에는 PREPARE 명령문이 없어요. 하지만 IBM Db2를 비롯한 여러 다른 SQL 방언에서 PREPARE가 나타나요.

더 알아보기 (Learn more)

준비된 명령문을 실행하는 방법은 EXECUTE 문서를, 해제하는 방법은 DEALLOCATE 문서를 함께 보면 좋아요.