【问题标题】:Snowflake procedure JavaScript compilation error: Uncaught SyntaxError: Unexpected token ':' in ERR_LOGGING atSnowflake 过程 JavaScript 编译错误:Uncaught SyntaxError: Unexpected token ':' in ERR_LOGGING at
【发布时间】:2021-10-24 12:43:48
【问题描述】:

需要有关用 JavaScript 编写的小型 Snowflake 存储过程的帮助,我收到以下错误, JavaScript 编译错误:Uncaught SyntaxError: Unexpected token ':' in ERR_LOGGING at ',绑定:[v_err_seq,APP_NAME,ERR_MSG, MISC_STR,v_time_st])"' 位置 10

代码如下,

    create or replace sequence SEQ_ERR;
create or replace table ERROR_LOG(ERR_SEQ NUMBER, APP_NAME VARCHAR(250), ERR_MSG VARCHAR(2500), MISC_STRING VARCHAR(2500), err_date timestamp);

CREATE OR REPLACE PROCEDURE ERR_LOGGING(app_name varchar, err_msg varchar, misc_str varchar )
returns string not null
language javascript
strict volatile
execute as caller
as
$$
try {
    var v_time_st = getScalar("SELECT CURRENT_TIMESTAMP");
    var v_err_seq = getScalar("SELECT SEQ_ERR.nextval");    
    error_msg = 'THis is in the line before the execute';
    var sqlCmd = `insert into ERROR_LOG (ERR_SEQ , APP_NAME, ERR_MSG , MISC_STRING, ERR_DATE) VALUES (:1, :2, :3, :4, :5)`;
    stmt = snowflake.execute({ sqlText: sqlCmd, binds: [v_err_seq, APP_NAME, ERR_MSG, sqlCmd,v_time_st]});
    }
catch (err)  {
    result= " "
    result =  "Failed: Code: " + err.code + "\n  State: " + err.state;
    result += "\n  Message: " + err.message;
    result += "\nStack Trace:\n" + err.stackTraceTxt;
    }  
function getScalar(queryString) {
    var out;
    cmd1 = {sqlText: queryString};
    stmt = snowflake.createStatement(cmd1);
    var rs;
    rs = stmt.execute();
    rs.next();
    return rs.getColumnValue(1);
    return out;
}

    
return result;
$$;

call ERR_LOGGING('TEST_APP', 'THis is an error messge', 'ON line 1');

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    问题从以下几行开始:

    var v_time_st = snowflake.execute( {sqlText: "SELECT CURRENT_TIMESTAMP;"} );
    var v_err_seq = snowflake.execute( {sqlText: "SELECT SEQ_ERR.nextval;"} );
    

    当您通过存储过程 API 运行 SQL 语句时,它会以称为 ResultSet 的对象的形式返回一个表。您将 ResultSet 返回到这些变量,而不是您想要的值。为了获取值,您需要使用 ResultSet 的.next() 方法,然后使用.getColumnValue() 方法。

    然后问题继续到下一行进行插入。它期望绑定的标量值,但发送的变量包含 ResultSets 对象及其伴随的复杂性。

    通常需要从 SQL 语句中获取单个标量值。如果您 100% 确定您的查询将准确返回一行和一列,那么您可以使用一个名为 getScalar 的辅助函数。这是一个例子:

    create or replace procedure FOO()
    returns timestamp
    language javascript
    strict volatile
    execute as caller
    as
    $$
    
    var v_time_st = getScalar("SELECT CURRENT_TIMESTAMP");
    
    return v_time_st;
    
    // Main function above, helper functions below.
    
    function getScalar(queryString) {
        var out;
        cmd1 = {sqlText: queryString};
        stmt = snowflake.createStatement(cmd1);
        var rs;
        rs = stmt.execute();
        rs.next();
        return rs.getColumnValue(1);
        return out;
    }
    
    $$;
    
    call foo();
    

    您可以将该辅助函数保留在您的主函数下方并且不碍事。从那里您可以执行此操作以根据需要分配变量:

    var v_time_st = getScalar("SELECT CURRENT_TIMESTAMP");
    var v_err_seq = getScalar("SELECT SEQ_ERR.nextval");
    

    根据您的更新,这里重构的代码应该可以工作:

    CREATE OR REPLACE PROCEDURE ERR_LOGGING(app_name varchar, err_msg varchar, misc_str varchar )
    returns string not null
    language javascript
    strict volatile
    execute as caller
    as
    $$
    try {
        var v_time_st = getScalar("SELECT CURRENT_TIMESTAMP");
        var v_err_seq = getScalar("SELECT SEQ_ERR.nextval");    
        var sqlCmd = `insert into ERROR_LOG (ERR_SEQ NUMBER, APP_NAME, ERR_MSG , MISC_STRING, ERR_DATE) VALUES (:1, :2, :3, :4, :5)`;
        stmt = snowflake.execute({ sqlText: sqlCmd, binds: [P_BATCH_ID, JOB_NAME, error_msg1, sql_command]});
        }
    catch (err)  {
        result= " "
        result =  "Failed: Code: " + err.code + "\n  State: " + err.state;
        result += "\n  Message: " + err.message;
        result += "\nStack Trace:\n" + err.stackTraceTxt;
        }  
    function getScalar(queryString) {
        var out;
        cmd1 = {sqlText: queryString};
        stmt = snowflake.createStatement(cmd1);
        var rs;
        rs = stmt.execute();
        rs.next();
        return rs.getColumnValue(1);
        return out;
    }
    
        
    return result;
    $$;
    
    call ERR_LOGGING('TEST_APP', 'THis is an error messge', 'ON line 1');
    

    【讨论】:

    • 感谢 Greg 的解释,我照你说的做了,但收到如下错误“JavaScript 编译错误:未捕获的 SyntaxError: Unexpected token ':' in ERR_LOGGING at ' , binds: [v_err_seq,APP_NAME, ERR_MSG, MISC_STR,v_time_st])"'位置 10"。更新后的代码在原问题中。
    • 我更新了我的答案并纠正了语法错误。滚动到底部以查看修改后的代码。现在试试。我没有创建表和序列,但是语法错误消失了,SQL 尝试运行。如果它不起作用,请发送表和序列的 DDL,我将使用 SQL 运行。
    • 感谢您的帮助,我对代码进行了一些更正,并附上了带有 DDL 的更新代码。收到此错误。 “失败:代码:100183 状态:P0000 消息:SQL 编译错误:位置 31 处的语法错误第 1 行意外'NUMBER'。堆栈跟踪:在 Snowflake.execute,第 7 行位置 21”
    • 当您遇到 SQL 编译错误时,查看过程尝试运行的内容的最简单方法是查看“查询历史记录”选项卡。
    • 感谢格雷格的帮助,它成功了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多