EXECUTE IMMEDIATE

EXECUTE IMMEDIATE

SQL 문장 또는 Snowflake Scripting 문장을 포함하는 문자열을 실행하는 명령이에요. 동적 SQL이나 익명 블록(anonymous block)을 실행할 때 사용해요.

출처: 문서

본문

EXECUTE IMMEDIATE는 다음 용도로 사용할 수 있어요:

  • Snowflake Scripting 블록에서 런타임까지 SQL 문장의 일부를 모르는 동적 SQL을 실행.
  • 세션 변수를 SQL 문장으로 설정하고, 그 세션 변수를 참조하여 SQL 문장을 실행.
  • SnowSQL 또는 Snowsight를 사용할 때 Snowflake Scripting 익명 블록을 실행.

구문 (Syntax)

EXECUTE IMMEDIATE '<string_literal>'
    [ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]

EXECUTE IMMEDIATE <variable>
    [ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]

EXECUTE IMMEDIATE $<session_variable>
    [ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]

필수 파라미터 (Required parameters)

  • 'string_literal' 또는 variable 또는 session_variable — 문장을 포함하는 문자열 리터럴, Snowflake Scripting 변수, 또는 세션 변수예요. 문장은 다음 중 하나가 될 수 있어요:

    • 단일 SQL 문장
    • 저장 프로시저 호출
    • 제어 흐름 문장(예: 루프 또는 분기 문장)
    • 블록

    세션 변수를 사용하는 경우 문장의 길이는 세션 변수의 최대 크기(16KB)를 초과해서는 안 돼요.

선택 파라미터 (Optional parameters)

  • USING ( bind_variable [ , bind_variable ... ] ) — 커서의 쿼리 정의(예: WHERE 절)에서 사용할 값을 보유하는 하나 이상의 바인드 변수를 지정해요.

반환값 (Returns)

EXECUTE IMMEDIATE는 실행된 문장의 결과를 반환해요. 예를 들어 문자열이나 변수가 SELECT 문장을 포함했다면 SELECT 문장의 결과 집합이 반환돼요.

사용 메모 (Usage notes)

  • string_literal, variable, 또는 session_variable은 오직 하나의 문장만 포함해야 해요. (블록은 본문에 여러 문장이 포함되어도 하나의 문장으로 간주해요.)
  • session_variable은 달러 기호($)를 앞에 붙여야 해요.
  • 지역 변수(local variable)에는 달러 기호($)를 붙이지 않아야 해요.

예시 (Examples)

Snowflake Scripting 블록에서 동적 SQL 실행

두 지역 변수에 정의된 문장을 실행하는 예시예요. EXECUTE IMMEDIATE가 문자열 리터럴뿐 아니라 문자열(VARCHAR)로 평가되는 표현식에서도 동작함을 보여줘요.

CREATE PROCEDURE execute_immediate_local_variable()
RETURNS VARCHAR
AS
DECLARE
  v1 VARCHAR DEFAULT 'CREATE TABLE temporary1 (i INTEGER)';
  v2 VARCHAR DEFAULT 'INSERT INTO temporary1 (i) VALUES (76)';
  result INTEGER DEFAULT 0;
BEGIN
  EXECUTE IMMEDIATE v1;
  EXECUTE IMMEDIATE v2  ||  ',(80)'  ||  ',(84)';
  result := (SELECT SUM(i) FROM temporary1);
  RETURN result::VARCHAR;
END;

Snowflake CLI, SnowSQL, Classic Console 또는 Python Connector 코드의 execute_stream/execute_string 메서드를 사용한다면 이 예시를 사용해요:

CREATE PROCEDURE execute_immediate_local_variable()
RETURNS VARCHAR
AS
$$
DECLARE
  v1 VARCHAR DEFAULT 'CREATE TABLE temporary1 (i INTEGER)';
  v2 VARCHAR DEFAULT 'INSERT INTO temporary1 (i) VALUES (76)';
  result INTEGER DEFAULT 0;
BEGIN
  EXECUTE IMMEDIATE v1;
  EXECUTE IMMEDIATE v2  ||  ',(80)'  ||  ',(84)';
  result := (SELECT SUM(i) FROM temporary1);
  RETURN result::VARCHAR;
END;
$$;

저장 프로시저를 호출해요:

CALL execute_immediate_local_variable();

+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+

바인드 변수가 포함된 문장 실행

Snowflake Scripting 저장 프로시저에서 USING 매개변수에 바인드 변수가 포함된 SELECT 문장을 EXECUTE IMMEDIATE로 실행하는 예시예요. 먼저 테이블을 만들고 데이터를 삽입해요:

CREATE OR REPLACE TABLE invoices (id INTEGER, price NUMBER(12, 2));

INSERT INTO invoices (id, price) VALUES
  (1, 11.11),
  (2, 22.22);

저장 프로시저를 만들어요:

CREATE OR REPLACE PROCEDURE min_max_invoices_sp(
    minimum_price NUMBER(12,2),
    maximum_price NUMBER(12,2))
  RETURNS TABLE (id INTEGER, price NUMBER(12, 2))
  LANGUAGE SQL
AS
DECLARE
  rs RESULTSET;
  query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price

Snowflake CLI, SnowSQL, Classic Console 또는 Python Connector 코드의 execute_stream/execute_string 메서드를 사용한다면 이 예시를 사용해요:

CREATE OR REPLACE PROCEDURE min_max_invoices_sp(
    minimum_price NUMBER(12,2),
    maximum_price NUMBER(12,2))
  RETURNS TABLE (id INTEGER, price NUMBER(12, 2))
  LANGUAGE SQL
AS
$$
DECLARE
  rs RESULTSET;
  query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price

저장 프로시저를 호출해요:

CALL min_max_invoices_sp(20, 30);

+----+-------+
| ID | PRICE |
|----+-------|
|  2 | 22.22 |
+----+-------+

세션 변수를 문장으로 설정하고 실행

세션 변수에 정의된 문장을 실행하는 예시예요:

SET stmt =
$$
    SELECT PI();
$$
;
EXECUTE IMMEDIATE $stmt;

+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+

SnowSQL 또는 Snowsight에서 익명 블록 실행

SnowSQL이나 Snowsight에서 Snowflake Scripting 익명 블록을 실행할 때는 블록을 문자열 리터럴(작은따옴표 또는 이중 달러 기호로 구분)로 지정하고, 블록을 EXECUTE IMMEDIATE 명령에 전달해야 해요. 다음 예시는 EXECUTE IMMEDIATE 명령에 전달된 익명 블록을 실행해요:

EXECUTE IMMEDIATE $$
DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := PI() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
$$
;

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+

더 알아보기 (Learn more)