我创建了一个存储过程,其中包含一个用于登录日志表的函数,输出如下: 100132 (P0000): JavaScript 执行错误: 未捕获错误:LOG_LEVEL 未在 FUNCTION_TEST 中定义,位于 ' throw "ERROR:"+err.message ' 位置 5 堆栈跟踪: 日志文件行:39 FUNCTION_TEST 行:5。
代码如下所示
create or replace procedure function_test()
returns varchar not null
language JAVASCRIPT
as
$$
const ProceName=Object.keys(this)[0];
try
{
log("INFO",ProceName,0,"RUNNING","","")
var copy_into_cmd = `copy into my_table from @my_stage
file_format=(format_name= 'my_file_format')
on_error = skip_file;`;
var copy_into_stmt = snowflake.createStatement({sqlText: copy_into_cmd});
log("INFO",ProceName,0,"EXECUTING",copy_into_stmt.getQueryId(),copy_into_stmt.getSqlText())
var result_set= copy_into_stmt.execute();
return "SUCCESS"
}
catch(err)
{
var query_id = copy_into_stmt.getQueryId();
var sqltext= copy_into_stmt.getSqlText();
log("INFO",ProceName,err.code,err.message,query_id,sqltext)
return err.message
}
function log(log_level,src_name,err,message,query_id,stmt_txt)
{
try
{
var load_cmd="insert into log_table(timestamp,log_level,usr_name,src_name,err,message,query_id,sql_text) values(current_timestamp(),?,current_user(),?,NULLIFZERO(?),?,?,?);"
var load_stmt=snowflake.createStatement({sqlText: load_cmd, binds:[LOG_LEVEL,SRC_NAME,ERR,MESSAGE,QUERY_ID,STMT_TXT]}).execute();
}
catch(err)
{
throw "ERROR: "+err.message
}
}
$$;
任何建议都会有帮助。
最佳答案
JavaScript 是一种区分大小写的语言。因此,您需要使用 LOG_LEVEL 更新该行,如下所示:
var load_stmt=snowflake.createStatement({sqlText: load_cmd, binds:[log_level,src_name,err,message,query_id,stmt_txt]}).execute();
当您从 SQL 引擎调用主函数/过程时,SQL 引擎将以大写形式发送参数名称(除非您将它们用双引号引起来);这就是为什么 main 函数会到达大写的函数参数。
关于stored-procedures - 如何绑定(bind)通过雪花存储过程中的函数传递的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70117330/