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程序如何从不在阶段的对象中更新字段?