调用Snowflake存储过程时遇SQL编译错误:行1位置4意外字符'S'
问题排查与修复方案
你遇到的SQL compilation error: syntax error line 1 at position 4 unexpected 'S'是由存储过程定义的语法错误直接导致的,同时存储过程代码中还存在多处JavaScript和SQL语法问题,具体如下:
1. 直接触发错误的根源
存储过程定义第一行存在语法错误:
CREATE OR REPLACE PROCEDURE Swapna_test_proc20)
过程名后缺少左括号且多了一个右括号,正确的无参数存储过程定义应为:
CREATE OR REPLACE PROCEDURE Swapna_test_proc20()
SQL解析器因这一行语法不符合规则,抛出了位置4的错误提示。
2. 存储过程内部代码的其他错误及修复
字符串与符号问题
var err="缺少闭合双引号,应改为var err="";var procResult2 = DATA SUCCESSFULLY LOADED":字符串未加引号,且结尾误用冒号代替分号,应改为var procResult2 = "DATA SUCCESSFULLY LOADED";getColumnValue("WHOLESALE_ID');引号不匹配,统一改为双引号或单引号,比如getColumnValue("WHOLESALE_ID")
变量名格式错误
JavaScript变量名不能包含空格,需修改:
table load stmt→table_load_stmtcolumnValue load→columnValue_loadsubstring load qry→substring_load_qry
SQL语句与Snowflake API调用错误
var table_load = 'Select "WHOLESALE_ID" from字符串未闭合,带空格的表名需用双引号包裹,修改为:var table_load = 'Select "WHOLESALE_ID" from "CPH DB DEV ENRICH BV ANALYTICS_CH GALEXIS GUTSCHRIFT OUTBOUND BONUSANDDISCOUNT_INVOI"';snowflake.createStatement ((sqlText: table load)).参数格式错误,需用{}包裹配置对象,修改为:var table_load_stmt = snowflake.createStatement({sqlText: table_load});- 调用
getColumnValue前需先调用next()移动到结果集的行,否则会报错,示例:if (exe_table_load_stmt.next()) { var columnValue_load = exe_table_load_stmt.getColumnValue("WHOLESALE_ID"); } substring函数参数错误(第一个参数应为目标字符串/列),SQL拼接需保证语法正确,示例:var substring_load_qry = `select substring("WHOLESALE_ID", 1, 3) as extracted_string from "${columnValue_load}"`;
修复后的完整示例代码
CREATE OR REPLACE PROCEDURE Swapna_test_proc20() RETURNS VARCHAR LANGUAGE JAVASCRIPT EXECUTE AS CALLER AS $$ var err = ""; var procResult2 = "DATA SUCCESSFULLY LOADED"; try { // 查询指定表的WHOLESALE_ID var table_load = 'Select "WHOLESALE_ID" from "CPH DB DEV ENRICH BV ANALYTICS_CH GALEXIS GUTSCHRIFT OUTBOUND BONUSANDDISCOUNT_INVOI"'; var table_load_stmt = snowflake.createStatement({sqlText: table_load}); var exe_table_load_stmt = table_load_stmt.execute(); // 处理结果集 if (exe_table_load_stmt.next()) { var columnValue_load = exe_table_load_stmt.getColumnValue("WHOLESALE_ID"); // 注意:假设columnValue_load是合法表名,需确保其有效性 var substring_load_qry = `select substring("WHOLESALE_ID", 1, 3) as extracted_string from "${columnValue_load}"`; var substring_stmt = snowflake.createStatement({sqlText: substring_load_qry}); var substring_result = substring_stmt.execute(); } return procResult2; } catch (e) { err = "Error: " + e.message; return err; } $$;
内容的提问来源于stack exchange,提问作者Swapnamayee Panda
相关产品推荐
相关产品推荐

