EXECUTE IMMEDIATE

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

É possível usar EXECUTE IMMEDIATE para fazer o seguinte:

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 SQL dinâmico em um bloco do Snowflake Scripting

Os exemplos a seguir executam o SQL dinâmico em um bloco do Snowflake Scripting.

Execução de instruções que contêm variáveis

Este exemplo executa instruções que são definidas em duas variáveis locais em um procedimento armazenado do Snowflake Scripting. 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

Chame o procedimento armazenado:

CALL execute_immediate_local_variable();
Copy
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+

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

Este exemplo usa EXECUTE IMMEDIATE para executar uma instrução SELECT com variáveis de vinculação no parâmetro USING em um procedimento armazenado do Snowflake Scripting. 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

Crie o procedimento armazenado:

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 < ?';
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):

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 < ?';
BEGIN
  rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
  RETURN TABLE(rs);
END;
$$
;
Copy

Chame o procedimento armazenado:

CALL min_max_invoices_sp(20, 30);
Copy
+----+-------+
| ID | PRICE |
|----+-------|
|  2 | 22.22 |
+----+-------+

Definição de uma variável de sessão para uma instrução e execuçã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 um bloco anônimo em SnowSQL ou no Classic Console

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 |
+-----------------+