【问题标题】:Insert into table via UDF table not working from stored procedure通过 UDF 表插入表不能从存储过程中工作
【发布时间】:2023-04-03 11:22:01
【问题描述】:

我的存储过程应该通过 UDF 将数据插入到表中。

我生成的字符串当我作为SQL语句运行时是正确的,但是当我通过存储过程执行它时,它会抛出一个语法错误。

这是 SQL 语句:

insert into dbname.public.TBLPROVIDER 
    select * 
    from table(f_TBLPROVIDER('dbname',cast('20211031233226' as bigint)));

这是存储过程失败的代码

var sql_tbl_populate  = "insert into " + S_DB_NAME + ".public." + TBL_NAME + " "
sql_tbl_populate += "select * from table(f_" + TBL_NAME +"('"+ S_DB_NAME + "',cast('" + S_TIMESTAMP + "' as bigint)));"
stmt_sql_tbl_populate = snowflake.createStatement({sqlText: sql_tbl_populate} );
stmt_sql_tbl_populate.execute();

错误是

存储过程 SP_POPULATE_TRGT_TABLES 中的执行错误:SQL 编译错误:位置 105 的语法错误第 1 行意外“dbname”。
在 Statement.execute 第 21 行位置 23

【问题讨论】:

  • 请检查 SQL 历史以查看从 SP 中使用的代码生成的确切命令。示例如下: var sql_tbl_populate = snowflake.createStatement({ sqlText: "INSERT INTO TABLE1 VALUES('" + TABLE_NAME + "','" + cols[i] + "')" + ";" }) ;
  • 您能否将整个过程添加到问题中?
  • 调试存储过程的一种方法是在执行之前从过程中返回 SQL 语句,例如。在调用 snowflake.createStatement 之前从过程中返回 sql_tbl_populate 并注释掉该语句之后的所有内容。

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


【解决方案1】:

我能够找到您的查询并找出您的 SP 的 DDL。

当您尝试插入 tbl_log 表时,问题在于以下查询:

var sqld = "insert into log_table values ('" + sql_tbl_populate + "')";

实际失败的查询是:

insert into log_table values ('insert into dbname.public.tablename select * from table(f_TBLPROVIDER('dbname',cast('20211031233226' as bigint)));')

因为您在变量“sql_tbl_populate”周围有单引号,而函数 f_TBLPROVIDER 中的参数已经有单引号。

当您在变量“sqld”中构建 INSERT 语句时,您需要转义“sql_tbl_populate”中的单引号。

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多