DO — 익명 코드 블록 실행

DO — 익명 코드 블록 실행

DO 문으로 익명 코드 블록, 다시 말해 프로시저 언어로 된 일시적인 익명 함수를 실행합니다. 이름 없는 함수를 한 번만 실행하고 싶을 때, 예를 들어 배치로 일괄 작업을 돌릴 때 주로 써요.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

DO [ LANGUAGE lang_name ] code

설명 (Description)

DO는 익명 코드 블록, 즉 프로시저 언어로 된 일시적인 익명 함수를 실행해요.

코드 블록은 매개변수가 없고 void를 돌려주는 함수의 몸통처럼 취급되어, 한 번만 파싱되고 실행됩니다.

선택적인 LANGUAGE 절은 코드 블록 앞이나 뒤 어디에도 쓸 수 있어요.

매개변수 (Parameters)

  • code — 실행할 프로시저 언어 코드예요. CREATE FUNCTION에서처럼 문자열 리터럴로 지정해야 합니다. 달러 따옴표(dollar-quoted) 리터럴 사용이 권장돼요.
  • lang_name — 코드가 쓰인 프로시저 언어의 이름이에요. 생략하면 기본값은 plpgsql이에요.

참고 사항 (Notes)

사용할 프로시저 언어는 CREATE EXTENSION으로 현재 데이터베이스에 이미 설치되어 있어야 해요. plpgsql은 기본적으로 설치되지만, 그 외 언어는 그렇지 않습니다.

사용자는 그 프로시저 언어에 대한 USAGE 권한이 있어야 하며, 언어가 신뢰할 수 없는(untrusted) 언어라면 수퍼유저여야 해요. 이것은 그 언어로 함수를 만들 때와 같은 권한 요구사항이에요.

DO가 트랜잭션 블록 안에서 실행되면, 프로시저 코드는 트랜잭션 제어 문을 실행할 수 없어요. 트랜잭션 제어 문은 DO가 자체 트랜잭션에서 실행될 때만 허용됩니다.

예시 (Examples)

schema public의 모든 뷰에 대해 role webuser에게 모든 권한을 부여하기:

DO $$DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END$$;

호환성 (Compatibility)

SQL 표준에는 DO 문이 없어요.

함께 보기 (See Also)

더 알아보기 (Learn more)

  • CREATE FUNCTION — 이름 있는 함수를 정의해 재사용
  • PL/pgSQL — DO 블록의 기본 언어가 되는 프로시저 언어
  • CREATE EXTENSION — 프로시저 언어를 설치해 DO에서 사용