雪花中的存储过程中是不是有打印命令
Posted
技术标签:
【中文标题】雪花中的存储过程中是不是有打印命令【英文标题】:Is there print command in stored proc in snowflake雪花中的存储过程中是否有打印命令 【发布时间】:2020-05-18 17:24:40 【问题描述】:我有一个动态 sql 中的 proc 引发错误。我需要查看 proc 正在运行的 sql 的打印语句。雪花的错误信息不是很有帮助。
这是我的存储过程
CREATE OR REPLACE PROCEDURE util.dbo.Restore_db_ver("source_db" varchar, "restore_db" varchar, "dest_db" varchar)
returns float
LANGUAGE javascript
AS
$$
var perm_cmd = "select cp_object,cp_object_name,cp_permission_type, cp_permission,cp_role from util.dbo.restore_perm where cp_database_name = '"+restore_db+"'"
var perm_cmd_stmt = snowflake.createStatement(sqlText: perm_cmd)
var perm_record = perm_cmd_stmt.execute()
while(perm_record.next())
var perm_object = perm_record.getColumnValue(1)
var perm_object_name = perm_record.getColumnValue(2)
var perm_permission_type = perm_record.getColumnValue(3)
var perm_permission_name = perm_record.getColumnValue(4)
var perm_role_name = perm_record.getColumnValue(5)
var sql_cmd1 = "CREATE OR REPLACE DATABASE "+restore_db+" CLONE "+source_db+" AT (OFFSET => -1800)"
var statement1 = snowflake.createStatement( sqlText: sql_cmd1 )
var result_set1 = statement1.execute()
var sql_cmd2 = perm_permission_type+" "+perm_permission_name+" ON "+perm_object+" "+perm_object_name+" TO ROLE "+perm_role_name
var statement2 = snowflake.createStatement( sqlText: sql_cmd2 )
var result_set2 = statement2.execute()
$$
这是抛出一个错误 JavaScript 执行错误:未捕获的 ReferenceError:权限名称未在 'var sql_cmd2 = perm_permission_type+" "+permission_name+" ON "+perm_object+" "+perm_object_name+" TO ROLE "+perm_role_name' 位置 44 位置的 RESTORE_DB_VER 中定义 stackstrace:RESTORE_DB_VER 行:17
有没有打印命令可以用来输出sql?
【问题讨论】:
【参考方案1】:选项 1: 要查看运行前执行的 SQL 命令,可以这样。
CREATE OR REPLACE PROCEDURE util.dbo.Restore_db_ver("source_db" varchar, "restore_db" varchar, "dest_db" varchar)
returns string
LANGUAGE JAVASCRIPT
AS
$$
var perm_cmd = "select cp_object,cp_object_name,cp_permission_type, cp_permission,cp_role from util.dbo.restore_perm where cp_database_name = '"+restore_db+"'";
return perm_cmd ;
$$
call <procedure> < params> ;
SELECT *
FROM TABLE(result_scan(last_query_id()));
选项2: 要查看执行了什么,您可以使用雪花查询标签和查询历史记录。
-- before executing the procedure
ALTER session SET QUERY_TAG = <procedure tag>;
使用过程标签过滤查询历史以列出所有执行的 SQL 命令。
【讨论】:
您的建议有效。我可以看到正在执行的查询。谢谢你:) @jaya 如果这是有效的解决方案并且与您的问题更相关,您应该将其标记为正确答案:)。它也将帮助未来的用户找到正确的答案。 完成。谢谢@Bino Thomas【参考方案2】:您的几行不以分号结尾,包括紧接在您的权限名称变量定义之前的那一行。如果没有分号,它看起来就像 JavaScript 的一个代码行,所以 permission_name 永远不会被定义为变量。您也不应该在循环内重新定义变量。
没有数据我无法测试代码,但它应该看起来更像这样:
CREATE OR REPLACE PROCEDURE util.dbo.Restore_db_ver("source_db" varchar, "restore_db" varchar, "dest_db" varchar)
returns float
LANGUAGE JAVASCRIPT
AS
$$
var perm_object, perm_object_name, perm_permission_type, perm_permission_name, perm_role_name, sql_cmd1, sql_cmd2, statement1, statement2
result_set1, result_set2;
var perm_cmd = "select cp_object,cp_object_name,cp_permission_type, cp_permission,cp_role from util.dbo.restore_perm where cp_database_name = '"+restore_db+"'";
var perm_cmd_stmt = snowflake.createStatement(sqlText: perm_cmd);
var perm_record = perm_cmd_stmt.execute();
while(perm_record.next())
perm_object = perm_record.getColumnValue(1);
perm_object_name = perm_record.getColumnValue(2);
perm_permission_type = perm_record.getColumnValue(3);
perm_permission_name = perm_record.getColumnValue(4);
perm_role_name = perm_record.getColumnValue(5);
sql_cmd1 = "CREATE OR REPLACE DATABASE "+restore_db+" CLONE "+source_db+" AT (OFFSET => -1800)";
statement1 = snowflake.createStatement( sqlText: sql_cmd1 );
result_set1 = statement1.execute();
sql_cmd2 = perm_permission_type+" "+perm_permission_name+" ON "+perm_object+" "+perm_object_name+" TO ROLE "+perm_role_name;
statement2 = snowflake.createStatement( sqlText: sql_cmd2 );
result_set2 = statement2.execute();
$$
【讨论】:
感谢@Greg Pavlik 的回复。该代码确实有帮助,但我在解析表中的数据时遇到问题。我猜,遇到空间或语法问题。有没有办法在运行它之前找到正在执行的命令,就像 sql world 中的打印语句一样。以上是关于雪花中的存储过程中是不是有打印命令的主要内容,如果未能解决你的问题,请参考以下文章