stored-procedures - 如何绑定(bind)通过雪花存储过程中的函数传递的变量

标签 stored-procedures snowflake-cloud-data-platform

我创建了一个存储过程,其中包含一个用于登录日志表的函数,输出如下: 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/

相关文章:

php - 如何更正存储过程错误#1934? (SQL 服务器/PHP)

sql - 在 SQL Server Mgmt Studio 中执行存储过程时,为什么要求我保存报告?

hadoop - 没有Hadoop/Hive的Apache Kylin

php - 使用存储过程更新数据库时出错

SQL Server : inserting multi-table output from stored procedure into separate tables

stored-procedures - 如何将输入参数值动态更改为存储过程入站 channel 适配器

python - 为什么 Apache 服务器在 python 中使用 Snowflake Ingest 模块抛出语法错误

sql - 如何使用 Lag Lead 或窗口函数根据列值合并行开始日期结束日期?

sql - 如何根据 ' Country Name' 和 'Lat' 生成一个 'Long' 字段 对于一个遍布全局的 unique_Id,在 SNOWFLAKES QUERY 中?

azure - 我想在 Snowflake 中加载我的时间戳列