雪花中的存储过程中是不是有打印命令

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 中的打印语句一样。

以上是关于雪花中的存储过程中是不是有打印命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在雪花中调用另一个存储过程中的存储过程

可以从雪花中的函数调用存储过程吗

雪花存储过程中的事务

雪花存储过程 - 多个多行 SQL 命令

如何获取雪花中执行存储过程的名称?

当我尝试使用雪花存储过程执行更改命令时给出错误?