EXECUTE IMMEDIATE¶
Exécute une chaîne qui contient une instruction SQL ou une instruction Exécution de scripts Snowflake.
Syntaxe¶
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> ... ] ) ]
Paramètres requis¶
'string_literal'
ou .variable
ou .session_variable
Un littéral de chaîne, une variable Exécution de scripts Snowflake ou une variable de session qui contient une instruction. Une instruction peut être l’un des éléments suivants :
Une seule instruction SQL
Un appel de procédure stockée
Une instruction de flux de contrôle (par exemple, une instruction looping ou branching)
Un bloc
Si vous utilisez une variable de session, la longueur de l’instruction ne doit pas dépasser la taille maximale d’une variable de session (256 octets).
Paramètres facultatifs¶
USING ( bind_variable [ , bind_variable ... ] )
Spécifie une ou plusieurs variables de liaison qui contiennent des valeurs à utiliser dans la définition de la requête du curseur (par exemple, dans une clause WHERE).
Renvoie¶
EXECUTE IMMEDIATE renvoie le résultat de l’instruction exécutée. Par exemple, si la chaîne ou la variable contient une instruction SELECT, le jeu de résultats de SELECT est renvoyé.
Notes sur l’utilisation¶
Le
string_literal
, lavariable
ou lasession_variable
ne doivent contenir qu’une seule instruction. (Un bloc est considéré comme une seule instruction, même si le corps du bloc en contient plusieurs).Une
session_variable
doit être précédée d’un signe dollar ($
).Une
variable
locale doit ne pas être précédée d’un signe dollar ($
).
Exemples¶
Exemples de base¶
Cet exemple exécute une instruction définie dans un littéral de chaîne :
EXECUTE IMMEDIATE 'SELECT PI()'; +-------------+ | PI() | |-------------| | 3.141592654 | +-------------+
Cet exemple exécute une instruction définie dans une variable de session :
SET stmt = $$ SELECT PI(); $$ ;EXECUTE IMMEDIATE $stmt; +-------------+ | PI() | |-------------| | 3.141592654 | +-------------+
Cet exemple exécute les instructions qui sont définies dans deux variables locales. Cela démontre également que EXECUTE IMMEDIATE fonctionne non seulement avec un littéral de chaîne, mais aussi avec une expression qui correspond à une chaîne (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 | +----------------------------------+
Cet exemple utilise EXECUTE IMMEDIATE pour exécuter une instruction SELECT qui contient des paramètres « bind ».
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;Remarque : si vous utilisez SnowSQL ou l”Classic Console, utilisez cet exemple à la place (voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL et l”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; $$ ;