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> ... ] ) ]
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¶
Exemplos básicos¶
Este exemplo executa uma instrução definida em uma cadeia de caracteres literal:
EXECUTE IMMEDIATE 'SELECT PI()'; +-------------+ | PI() | |-------------| | 3.141592654 | +-------------+
Este exemplo executa uma instrução definida em uma variável de sessão:
SET stmt = $$ SELECT PI(); $$ ;EXECUTE IMMEDIATE $stmt; +-------------+ | PI() | |-------------| | 3.141592654 | +-------------+
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; $$;CALL execute_immediate_local_variable(); +----------------------------------+ | EXECUTE_IMMEDIATE_LOCAL_VARIABLE | |----------------------------------| | 240 | +----------------------------------+
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;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; $$ ;