Snowflake 过程 JavaScript 编译错误:Uncaught SyntaxError: Unexpected token ':' in ERR_LOGGING at

Posted

技术标签:

【中文标题】Snowflake 过程 JavaScript 编译错误:Uncaught SyntaxError: Unexpected token \':\' in ERR_LOGGING at【英文标题】: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');

【问题讨论】:

【参考方案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 编译错误时,查看过程尝试运行的内容的最简单方法是查看“查询历史记录”选项卡。 感谢格雷格的帮助,它成功了

以上是关于Snowflake 过程 JavaScript 编译错误:Uncaught SyntaxError: Unexpected token ':' in ERR_LOGGING at的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Snowflake Javascript 存储过程或函数遍历表中的所有列?

将存储过程从 Teradata BTEQ 迁移到 Snowflake

Snowflake JavaScript程序如何从不在阶段的对象中更新字段?

在没有 JavaScript 的情况下将 Oracle PL/SQL 移植到 Snowflake

在 Snowflake 中处理多个 SQL 语句的存储过程

DBT snowflake utf-8' 编解码器无法解码位置 1031 中的字节 0xa0:无效的起始字节