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:
Em um bloco do Snowflake Scripting, execute o SQL dinâmico, em que partes da instrução SQL não são conhecidas até o tempo de execução. Para exemplos, consulte Execução de SQL dinâmico em um bloco do Snowflake Scripting.
Defina uma variável de sessão para uma instrução SQL e faça referência à variável de sessão para executar a instrução SQL. Para obter um exemplo, consulte Definição de uma variável de sessão para uma instrução e execução.
Se estiver usando SnowSQL ou Classic Console, execute um bloco anônimo do Snowflake Scripting. Para obter um exemplo, consulte Execução de um bloco anônimo em SnowSQL ou no Classic Console.
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> ... ] ) ]
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
ousession_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;
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;
$$;
Chame o procedimento armazenado:
CALL execute_immediate_local_variable();
+----------------------------------+
| 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);
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;
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;
$$
;
Chame o procedimento armazenado:
CALL min_max_invoices_sp(20, 30);
+----+-------+
| 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();
$$
;
EXECUTE IMMEDIATE $stmt;
+-------------+
| 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;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 28.274333882 |
+-----------------+