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

Exemplos básicos

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

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

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

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

Este exemplo executa instruções que são definidas em duas variáveis locais. Isto 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
CALL execute_immediate_local_variable();
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+
Copy

Este exemplo usa EXECUTE IMMEDIATE para executar uma instrução SELECT que contém parâmetros de vinculação.

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

Nota: se você estiver usando SnowSQL ou Classic Console, use este exemplo (consulte Como usar o Script Snowflake no SnowSQL e na Classic Console):

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