【问题标题】: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?

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案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 中的打印语句一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2021-06-22
    • 2021-10-12
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多