EXECUTE IMMEDIATE

Executa uma cadeia de caracteres que contém uma instrução SQL ou uma instrução Script Snowflake.

Sintaxe

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> ... ] ) ]
Copy

Parâmetros obrigatórios

'string_literal' ou . variable ou . session_variable

Uma cadeia de caracteres literal, uma variável do Script Snowflake ou uma variável de sessão que contém uma instrução. Uma instrução pode ser qualquer uma das seguintes opções:

  • Uma única instrução SQL.

  • Uma chamada de procedimento armazenado

  • Uma instrução de fluxo de controle (por exemplo, instrução de looping ou ramificação)

  • Um bloco

Se você usar uma variável de sessão, a extensão da instrução não deve exceder o tamanho máximo de uma variável de sessão (256 bytes).

Parâmetros opcionais

USING ( bind_variable [ , bind_variable ... ] )

Especifica uma ou mais variáveis de vinculação que contêm valores a serem usados na definição de consulta do cursor (por exemplo, em uma cláusula WHERE).

Retornos

EXECUTE IMMEDIATE retorna o resultado da instrução executada. Por exemplo, se a cadeia de caracteres ou variável contivesse uma instrução SELECT, então o conjunto de resultados da instrução SELECT seria devolvido.

Notas de uso

  • O string_literal, variable ou session_variable deve conter apenas uma instrução. (Um bloco é considerado como uma instrução, mesmo que o corpo do bloco contenha várias instruções).

  • Um session_variable deve ser precedido por um sinal de dólar ($).

  • Um variable local não deve ser precedido por um sinal de dólar ($).

Exemplos

A seguir estão alguns exemplos que usam o comando EXECUTE IMMEDIATE.

Execução de uma cadeia de caracteres literal

Este exemplo executa uma instrução definida em uma cadeia de caracteres literal:

EXECUTE IMMEDIATE 'SELECT PI()';
Copy
+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+

Execução de uma instrução em uma variável de sessão

Este exemplo executa uma instrução definida em uma variável de sessão:

SET stmt =
$$
    SELECT PI();
$$
;
Copy
EXECUTE IMMEDIATE $stmt;
Copy
+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+

Execução de instruções com variáveis

Este exemplo executa instruções que são definidas em duas variáveis locais em um procedimento armazenado do Script Snowflake. Este exemplo também demonstra que EXECUTE IMMEDIATE funciona não somente com uma cadeia de caracteres literal, mas também com uma expressão que avalia como uma cadeia de caracteres (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;
Copy

Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream ou execute_string no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):

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;
$$;
Copy
CALL execute_immediate_local_variable();
Copy
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+

Execução de um bloco anônimo em SnowSQL ou Console clássico

Ao executar um bloco anônimo do Script Snowflake no SnowSQL ou Classic Console, você deve especificar o bloco como um literal de cadeia de caracteres (delimitado por aspas simples ou sinais de dólar duplo) e deve passar o bloco para o comando EXECUTE IMMEDIATE. Para obter mais informações, consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python.

Este exemplo executa um bloco anônimo passado para o comando 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;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+

Execução de uma instrução com variáveis de vinculação

Este exemplo usa EXECUTE IMMEDIATE para executar uma instrução SELECT que contém variáveis de vinculação no parâmetro USING em um bloco do Script Snowflake. Primeiro, crie a tabela e insira os dados:

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

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

Agora execute o bloco:

DECLARE
  rs RESULTSET;
  query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?';
  minimum_price NUMBER(12,2) DEFAULT 20.00;
  maximum_price NUMBER(12,2) DEFAULT 30.00;
BEGIN
  rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
  RETURN TABLE(rs);
END;
Copy

Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream ou execute_string no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):

EXECUTE IMMEDIATE $$
DECLARE
  rs RESULTSET;
  query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?';
  minimum_price NUMBER(12,2) DEFAULT 20.00;
  maximum_price NUMBER(12,2) DEFAULT 30.00;
BEGIN
  rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
  RETURN TABLE(rs);
END;
$$
;
Copy
+----+-------+
| ID | PRICE |
|----+-------|
|  2 | 22.22 |
+----+-------+