gpt4 book ai didi

procedure - 如何调试 Snowflake 存储过程?

转载 作者:行者123 更新时间:2023-12-05 02:10:35 28 4
gpt4 key购买 nike

我正在使用雪花云数据库,请帮我提供一个调试程序或函数的工具。

最佳答案

以下 Snowflake Javascript 存储过程是我用来开始新存储过程的模板。它包含大量调试技巧,例如:

  • 它有一个“我在哪里?”变量,让您了解您在代码中的位置
  • 它在过程中收集信息到数组中
  • 将该数组返回到调用命令的标准输出
  • 它有一个异常 block 的“良好开端”,如果调用存储过程失败,异常 block 的内容也会被推送到标准输出。

我一直想添加的是在代码中也设置一个查询标记,这在查看查询历史时会很有帮助,可以轻松识别在执行存储过程时使用的 SQL 命令。

这与最终的“调试技巧”“相关”——在开发或测试环境中开发存储过程时,尤其是在构建动态 SQL 语句时,您应该始终查看查询历史记录(您的代码执行的实际查询)。查看您的查询历史记录是必须要做的,它将准确地向您显示运行的命令和它们运行的​​操作顺序。

这是它使用的示例表的代码,希望对您有所帮助...丰富

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');

关于procedure - 如何调试 Snowflake 存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58623248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com