Exemples de cas d’utilisation courants d’Exécution de scripts Snowflake¶
Vous pouvez écrire des blocs anonymes et des procédures stockées qui utilisent des éléments, des types de données et des variables du langage Exécution de scripts Snowflake pour des solutions qui répondent à des cas d’utilisation courants. Cette rubrique comprend des exemples de code d’Exécution de scripts Snowflake pour certains cas d’utilisation courants.
Mettre à jour les données d’une table à l’aide d’une entrée de l’utilisateur¶
L’exemple suivant crée une procédure stockée qui met à jour les données d’une table à l’aide d’une entrée utilisateur. Il utilise une boucle FOR pour parcourir les lignes d’une table RESULTSET. La boucle FOR contient la logique conditionnelle. Les variables de liaison basées sur l’entrée de l’utilisateur déterminent les mises à jour exactes effectuées par la procédure stockée.
L’exemple utilise les données suivantes :
CREATE OR REPLACE TABLE bonuses (
emp_id INT,
performance_rating INT,
salary NUMBER(12, 2),
bonus NUMBER(12, 2)
);
INSERT INTO bonuses (emp_id, performance_rating, salary, bonus) VALUES
(1001, 3, 100000, NULL),
(1002, 1, 50000, NULL),
(1003, 4, 75000, NULL),
(1004, 4, 80000, NULL),
(1005, 5, 120000, NULL),
(1006, 2, 60000, NULL),
(1007, 5, 40000, NULL),
(1008, 3, 140000, NULL),
(1009, 1, 95000, NULL);
SELECT * FROM bonuses;
+--------+--------------------+-----------+-------+
| EMP_ID | PERFORMANCE_RATING | SALARY | BONUS |
|--------+--------------------+-----------+-------|
| 1001 | 3 | 100000.00 | NULL |
| 1002 | 1 | 50000.00 | NULL |
| 1003 | 4 | 75000.00 | NULL |
| 1004 | 4 | 80000.00 | NULL |
| 1005 | 5 | 120000.00 | NULL |
| 1006 | 2 | 60000.00 | NULL |
| 1007 | 5 | 40000.00 | NULL |
| 1008 | 3 | 140000.00 | NULL |
| 1009 | 1 | 95000.00 | NULL |
+--------+--------------------+-----------+-------+
La procédure stockée suivante utilise une boucle FOR pour itérer sur les lignes d’un RESULTSET pour la table bonuses
. Elle applique la prime sous la forme d’un pourcentage spécifié du salaire de chaque employé ayant obtenu la note de performance spécifiée. La procédure stockée utilise une logique conditionnelle pour n’appliquer la prime qu’aux employés ayant la note de performance spécifiée. Elle utilise également les entrées (bonus_percentage
et performance_value
) comme variables de liaison.
CREATE OR REPLACE PROCEDURE apply_bonus(bonus_percentage INT, performance_value INT)
RETURNS TEXT
LANGUAGE SQL
AS
DECLARE
-- Use input to calculate the bonus percentage
updated_bonus_percentage NUMBER(2,2) DEFAULT (:bonus_percentage/100);
-- Declare a result set
rs RESULTSET;
BEGIN
-- Assign a query to the result set and execute the query
rs := (SELECT * FROM bonuses);
-- Use a FOR loop to iterate over the records in the result set
FOR record IN rs DO
-- Assign variable values using values in the current record
LET emp_id_value INT := record.emp_id;
LET performance_rating_value INT := record.performance_rating;
LET salary_value NUMBER(12, 2) := record.salary;
-- Determine whether the performance rating in the record matches the user input
IF (performance_rating_value = :performance_value) THEN
-- If the condition is met, update the bonuses table using the calculated bonus percentage
UPDATE bonuses SET bonus = ( :salary_value * :updated_bonus_percentage )
WHERE emp_id = :emp_id_value;
END IF;
END FOR;
-- Return text when the stored procedure completes
RETURN 'Update applied';
END;
Remarque : si vous utilisez SnowSQL, Classic Console, ou la méthode execute_stream
ou execute_string
dans le code Python Connector, utilisez cet exemple à la place (voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL, Classic Console, et le connecteur Python) :
CREATE OR REPLACE PROCEDURE apply_bonus(bonus_percentage INT, performance_value INT)
RETURNS TEXT
LANGUAGE SQL
AS
$$
DECLARE
-- Use input to calculate the bonus percentage
updated_bonus_percentage NUMBER(2,2) DEFAULT (:bonus_percentage/100);
-- Declare a result set
rs RESULTSET;
BEGIN
-- Assign a query to the result set and execute the query
rs := (SELECT * FROM bonuses);
-- Use a FOR loop to iterate over the records in the result set
FOR record IN rs DO
-- Assign variable values using values in the current record
LET emp_id_value INT := record.emp_id;
LET performance_rating_value INT := record.performance_rating;
LET salary_value NUMBER(12, 2) := record.salary;
-- Determine whether the performance rating in the record matches the user input
IF (performance_rating_value = :performance_value) THEN
-- If the condition is met, update the bonuses table using the calculated bonus percentage
UPDATE bonuses SET bonus = ( :salary_value * :updated_bonus_percentage )
WHERE emp_id = :emp_id_value;
END IF;
END FOR;
-- Return text when the stored procedure completes
RETURN 'Update applied';
END;
$$
;
Pour exécuter la procédure stockée, indiquez le pourcentage de la prime et l’évaluation des performances. Par exemple, appelez la procédure stockée et appliquez une prime de 3 % aux employés dont la performance est évaluée à 5 :
CALL apply_bonus(3, 5);
Exécutez une requête pour afficher les résultats :
SELECT * FROM bonuses;
+--------+--------------------+-----------+---------+
| EMP_ID | PERFORMANCE_RATING | SALARY | BONUS |
|--------+--------------------+-----------+---------|
| 1001 | 3 | 100000.00 | NULL |
| 1002 | 1 | 50000.00 | NULL |
| 1003 | 4 | 75000.00 | NULL |
| 1004 | 4 | 80000.00 | NULL |
| 1005 | 5 | 120000.00 | 3600.00 |
| 1006 | 2 | 60000.00 | NULL |
| 1007 | 5 | 40000.00 | 1200.00 |
| 1008 | 3 | 140000.00 | NULL |
| 1009 | 1 | 95000.00 | NULL |
+--------+--------------------+-----------+---------+
Filtrer et collecter les données¶
L’exemple suivant crée une procédure stockée qui filtre et collecte les données d’une table. La procédure insère des lignes utilisant les données collectées dans une autre table afin de suivre les tendances historiques.
L’exemple utilise les données suivantes, qui suivent la propriété et les paramètres des machines virtuelles (VMs) :
CREATE OR REPLACE TABLE vm_ownership (
emp_id INT,
vm_id VARCHAR
);
INSERT INTO vm_ownership (emp_id, vm_id) VALUES
(1001, 1),
(1001, 5),
(1002, 3),
(1003, 4),
(1003, 6),
(1003, 2);
CREATE OR REPLACE TABLE vm_settings (
vm_id INT,
vm_setting VARCHAR,
value NUMBER
);
INSERT INTO vm_settings (vm_id, vm_setting, value) VALUES
(1, 's1', 5),
(1, 's2', 500),
(2, 's1', 10),
(2, 's2', 600),
(3, 's1', 3),
(3, 's2', 400),
(4, 's1', 8),
(4, 's2', 700),
(5, 's1', 1),
(5, 's2', 300),
(6, 's1', 7),
(6, 's2', 800);
CREATE OR REPLACE TABLE vm_settings_history (
vm_id INT,
vm_setting VARCHAR,
value NUMBER,
owner INT,
date DATE
);
Supposons qu’une entreprise souhaite suivre les données de cette table dans le temps lorsque les valeurs des paramètres dépassent des seuils spécifiques. La procédure stockée suivante collecte et filtre les données de la table vm_settings
, puis insère des lignes dans la table vm_settings_history
lorsque les conditions suivantes sont remplies :
La valeur
s1
devm_setting
est inférieure à celle de5
.La valeur
s2
devm_setting
est supérieure à celle de500
.
Les lignes insérées dans la table vm_settings_history
comprennent toutes les valeurs des colonnes de la table vm_settings
, ainsi que le emp_id
de l’employé propriétaire de la VM et la date du jour.
CREATE OR REPLACE PROCEDURE vm_user_settings()
RETURNS VARCHAR
LANGUAGE SQL
AS
DECLARE
-- Declare a cursor and a variable
c1 CURSOR FOR SELECT * FROM vm_settings;
current_owner NUMBER;
BEGIN
-- Open the cursor to execute the query and retrieve the rows into the cursor
OPEN c1;
-- Use a FOR loop to iterate over the records in the result set
FOR record IN c1 DO
-- Assign variable values using values in the current record
LET current_vm_id NUMBER := record.vm_id;
LET current_vm_setting VARCHAR := record.vm_setting;
LET current_value NUMBER := record.value;
-- Assign a value to the current_owner variable by querying the vm_ownership table
SELECT emp_id INTO :current_owner
FROM vm_ownership
WHERE vm_id = :current_vm_id;
-- If the record has a vm_setting equal to 's1', determine whether its value is less than 5
IF (current_vm_setting = 's1' AND current_value < 5) THEN
-- If the condition is met, insert a row into the vm_settings_history table
INSERT INTO vm_settings_history VALUES (
:current_vm_id,
:current_vm_setting,
:current_value,
:current_owner,
SYSDATE());
-- If the record has a vm_setting equal to 's2', determine whether its value is greater than 500
ELSEIF (current_vm_setting = 's2' AND current_value > 500) THEN
-- If the condition is met, insert a row into the vm_settings_history table
INSERT INTO vm_settings_history VALUES (
:current_vm_id,
:current_vm_setting,
:current_value,
:current_owner,
SYSDATE());
END IF;
END FOR;
-- Close the cursor
CLOSE c1;
-- Return text when the stored procedure completes
RETURN 'Success';
END;
Remarque : si vous utilisez SnowSQL, Classic Console, ou la méthode execute_stream
ou execute_string
dans le code Python Connector, utilisez cet exemple à la place (voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL, Classic Console, et le connecteur Python) :
CREATE OR REPLACE PROCEDURE vm_user_settings()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
DECLARE
-- Declare a cursor and a variable
c1 CURSOR FOR SELECT * FROM vm_settings;
current_owner NUMBER;
BEGIN
-- Open the cursor to execute the query and retrieve the rows into the cursor
OPEN c1;
-- Use a FOR loop to iterate over the records in the result set
FOR record IN c1 DO
-- Assign variable values using values in the current record
LET current_vm_id NUMBER := record.vm_id;
LET current_vm_setting VARCHAR := record.vm_setting;
LET current_value NUMBER := record.value;
-- Assign a value to the current_owner variable by querying the vm_ownership table
SELECT emp_id INTO :current_owner
FROM vm_ownership
WHERE vm_id = :current_vm_id;
-- If the record has a vm_setting equal to 's1', determine whether its value is less than 5
IF (current_vm_setting = 's1' AND current_value < 5) THEN
-- If the condition is met, insert a row into the vm_settings_history table
INSERT INTO vm_settings_history VALUES (
:current_vm_id,
:current_vm_setting,
:current_value,
:current_owner,
SYSDATE());
-- If the record has a vm_setting equal to 's2', determine whether its value is greater than 500
ELSEIF (current_vm_setting = 's2' AND current_value > 500) THEN
-- If the condition is met, insert a row into the vm_settings_history table
INSERT INTO vm_settings_history VALUES (
:current_vm_id,
:current_vm_setting,
:current_value,
:current_owner,
SYSDATE());
END IF;
END FOR;
-- Close the cursor
CLOSE c1;
-- Return text when the stored procedure completes
RETURN 'Success';
END;
$$;
Exécutez la procédure stockée :
CALL vm_user_settings();
Vous pouvez voir les données que la procédure a insérées dans la table vm_settings_history
en exécutant la requête suivante :
SELECT * FROM vm_settings_history ORDER BY vm_id;
+-------+------------+-------+-------+------------+
| VM_ID | VM_SETTING | VALUE | OWNER | DATE |
|-------+------------+-------+-------+------------|
| 2 | s2 | 600 | 1003 | 2024-04-01 |
| 3 | s1 | 3 | 1002 | 2024-04-01 |
| 4 | s2 | 700 | 1003 | 2024-04-01 |
| 5 | s1 | 1 | 1001 | 2024-04-01 |
| 6 | s2 | 800 | 1003 | 2024-04-01 |
+-------+------------+-------+-------+------------+