Следующая хранимая процедура Snowflake Javascript - это шаблон, который я использую для запуска новых хранимых процедур. Он содержит множество приемов отладки, таких как:
- У него есть «где я?»переменная, которая дает вам представление о том, где в коде вы
- собираете информацию в массив по мере продвижения процесса
- и возвращает этот массив в стандартный вывод команды вызова
- у него есть "хорошее начало" блока исключений, содержимое которого также выталкивается на стандартный вывод при вызове хранимой процедуры, если она завершится неудачей.
Что-то, что я имеюсмысл в том, чтобы добавить это установить тег запроса в коде, который будет полезен при просмотре истории запросов, чтобы легко идентифицировать команды SQL, которые использовались при выполнении хранимой процедуры.
Это «связано» с последней «уловкой отладки» - вы всегда должны просматривать историю запросов (фактические запросы, выполняемые вашим кодом) при разработке хранимых процедур в среде разработки или тестирования, особенно когда вы создаете динамический SQLзаявления. Просмотр истории запросов является обязательным и покажет вам точно, какие команды выполняются, и порядок их выполнения.
Вот код с таблицей примеров, которую он использует, надеюсь, это поможет ... Rich
CREATE OR REPLACE TABLE test_scripts (
load_seq number,
script varchar(2000)
);
INSERT INTO test_scripts values
(1, 'SELECT current_timestamp();'),
(2, 'SELECT current_warehouse();'),
(3, 'SELECT COUNT(*) FROM snowflake.account_usage.tables;'),
(4, 'SELECT current_date();'),
(5, 'SELECT current_account();'),
(6, 'SELECT COUNT(*) FROM snowflake.account_usage.tables;'),
(7, 'SELECT ''RICH'';');
select * from test_scripts;
CREATE OR REPLACE PROCEDURE sp_test(p1 varchar, p2 varchar)
RETURNS ARRAY
LANGUAGE javascript
EXECUTE AS caller
AS
$$
//note: you can change the RETURN to VARCHAR if needed
// but the array "looks nice"
try {
var whereAmI = 1;
var return_array = [];
var counter = 0;
var p1_str = "p1: " + P1
var p2_str = "p2: " + P2
var load_seq = P1;
var continue_flag = P2;
whereAmI = 2;
return_array.push(p1_str)
return_array.push(p2_str)
whereAmI = 3;
//which SQL do I want to run?
if (continue_flag=="YES") {
return_array.push("query 1")
var sqlquery = "SELECT * FROM test_scripts WHERE load_seq >= " + load_seq + " order by 1, 2;";
}
else {
return_array.push("query 2")
var sqlquery = "SELECT * FROM test_scripts WHERE load_seq = " + load_seq + " order by 1, 2;";
}
whereAmI = 4;
//begin the run of grabbing the commands
var stmt = snowflake.createStatement( {sqlText: sqlquery} );
var rs = stmt.execute();
whereAmI = 5;
// Loop through the results, processing one row at a time...
while (rs.next()) {
counter = counter + 1;
var tmp_load_seq = rs.getColumnValue(1);
var tmp_script = rs.getColumnValue(2);
var tmp_rs = snowflake.execute({sqlText: tmp_script});
tmp_rs.next();
var tmp_col1 = tmp_rs.getColumnValue(1);
return_array.push("tmp_col1: " + tmp_col1)
}
whereAmI = 6;
return_array.push("end process - counter: " + counter)
return return_array;
}
catch (err) {
return_array.push("error found")
return_array.push(whereAmI)
return_array.push(err)
return return_array;
}
$$;
CALL sp_test(3, 'NO');