【问题标题】:Execution error in stored procedure : Unsupported type for binding argument 2undefined存储过程中的执行错误:绑定参数 2undefined 的类型不受支持
【发布时间】:2023-03-31 20:49:01
【问题描述】:

我正在执行

CALL  LOAD_CUSTDIM_HOUSTONS:

执行以下操作:

  1. 我正在运行此代码以从 STG_HOUSTON 表中获取唯一的客户详细信息,例如消费者编号和客户名称,并从上面的客户名称(即休斯顿的)的 DIM_CUSTOMER 键中获取 Max(CUST_DImKEY)。

  2. 接下来我正在检查 Max 键值是否为空,我的意思是与 CUSTOMER 不匹配,因此键值第一次始终为 1,下一次它将是最大值 + 1。

  3. 一旦我们得到这个绑定这个值和 select where 子句将得到唯一的客户并插入到客户维度表中。

存储过程如下所示:

create or replace procedure LOAD_CUSTDIM_HOUSTONS()
    returns varchar not null
    language javascript
    as
    $$
    var return_value = "";
    
 try 
   {
    var SQL_SMT = "SELECT DISTINCT CONSUMER_NUMBER,CUSTOMER_NAME FROM STG_HOUSTONS ORDER BY CONSUMER_NUMBER ASC";
    var stmt1 = snowflake.createStatement(
           {
           sqlText: SQL_SMT
           }
                                        );
    /* Creates result set */
    var res1 = stmt1.execute(); 
     
    while (res1.next())  
    {
      var  var_ConsumNo=res1.getColumnValue(1);
      var  var_custname=res1.getColumnValue(2);
      return_value =" Inside While";        
      var_custname = "'" + var_custname + "'";
        var t_SQLstmt = " SELECT GET_CUSTDIMKEYS(?)" ;       

        var t_stmt = snowflake.createStatement ({sqlText: t_SQLstmt,binds: [var_custname]});
        
        var res2 = t_stmt.execute();
        res2.next();
        var_Custkey =res2.getColumnValue(1)
        return_value= return_value + var_Custkey;
        if (var_CustKey == null)
          {
            var_CustdimKey =1
          }
        else
          {
           var_CustdimKey=var_CustKey+1
          }
          return_value= return_value + var_CustdimKey.toString();
           var SQL_INSDIMCUS="INSERT INTO DIM_CUSTOMER(CUSTOMER_KEY,CUSTOMER_ID,CUSTOMER_NAME,CONSUMER_ID,CONSUMER_NAME,CUSTOMER_IND,TODATE)" +  " SELECT DISTINCT :1,  CUSTOMER_NUMBER,CUSTOMER_NAME,CONSUMER_NUMBER,CONSUMER_SHPPNG_FNAME + ' ' + CONSUMER_SHPPNG_LNAME AS CONSUMER_NAME, FALSE, NULL FROM STG_HOUSTONS WHERE CONSUMER_NUMBER = :2 ;";  
           
           var stmt = snowflake.createStatement({sqlText: SQL_INSDIMCUS,binds: [var_CustdimKey,var_ConsumNo]} ); 
           var res3 = stmt.execute();  
                                
           result = "COMPLETED SUCCESSFULLY!";
     }                                     
 }              
 catch (err)  
 {    result = "Failed!";
      var time_st = snowflake.execute( {sqlText: `SELECT CURRENT_TIMESTAMP;`} );
      snowflake.execute({
      sqlText: `insert into PROC_ERROR_LOG 
                 VALUES (?,?,?,?,?)`
      ,binds: ['LOAD CUSTOMER DIMENSION HOUSTONS',err.code, err.state,err.message, err.stackTraceTxt]
      });
 }
    return return_value;
    $$
    ;

这是我用来获取 max(DIM CUST KEY) 的函数。

create or replace function GET_CUSTDIMKEYS ( CUSTOMERNAME varchar )
returns bigint
as 'Select max(CUSTOMER_KEY)
from PUBLIC.DIM_CUSTOMER
where CUSTOMER_NAME = CUSTOMERNAME ';

我尝试使用绑定变量/直接替换值来动态创建 SQL 并执行它。

使用DBeaver21.1.1 IDE创建雪花存储过程和函数

这是IDE创建的执行日志。

2021-10-05 20:44:48.030 - SQL Error [100183] [P0000]: Execution error in store procedure LOAD_CUSTDIM_HOUSTONS:
Unsupported type for binding argument 2undefined
At Snowflake.execute, line 49 position 14
org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [100183] [P0000]: Execution error in store procedure LOAD_CUSTDIM_HOUSTONS:
Unsupported type for binding argument 2undefined
At Snowflake.execute, line 49 position 14
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCPreparedStatementImpl.executeStatement(JDBCPreparedStatementImpl.java:208)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:510)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:441)
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:171)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:428)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:813)
at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3280)
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:118)
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:171)
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:116)
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:4624)
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

【问题讨论】:

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


    【解决方案1】:

    第 49 行是:

          sqlText: `insert into PROC_ERROR_LOG 
                     VALUES (?,?,?,?,?)`
          ,binds: ['LOAD CUSTOMER DIMENSION HOUSTONS',err.code, err.state,err.message, err.stackTraceTxt]
    

    错误信息:

    Unsupported type for binding argument 2undefined
    

    表示传入绑定参数的变量未定义。

    这告诉我变量“err”没有正确初始化。我见过一些情况,在某些情况下,比如调用一个对象上不存在的函数时,虽然抛出了异常,但传递给 catch 块的参数仍然是 NULL。

    您需要查看此特定会话的查询历史记录,找出从 SP 运行的哪个查询失败,并找出原因。

    在 catch 块中,尝试在使用其属性之前检查“err”对象,例如:

    if (err) {
      snowflake.execute({
          sqlText: `insert into PROC_ERROR_LOG 
                     VALUES (?,?,?,?,?)`
          ,binds: ['LOAD CUSTOMER DIMENSION HOUSTONS',err.code, err.state,err.message, err.stackTraceTxt]
          });
    } else {
      snowflake.execute({
          sqlText: `insert into PROC_ERROR_LOG 
                     VALUES (?,?,?,?,?)`
          ,binds: ['LOAD CUSTOMER DIMENSION HOUSTONS','my code', 'my state','my error', 'my stack']
          });
    }
    

    这样可以避免这样的失败。

    【讨论】:

    • 我也尝试了您的修改,但不走运,我仍然得到相同的错误。SQL 错误 [100183] [P0000]:存储过程 LOAD_CUSTDIM_HOUSTONS 中的执行错误:绑定参数 2undefined At Snowflake 的类型不受支持.execute,第 51 行位置 16
    • 第 51 行在下面吗? snowflake.execute({ sqlText: insert into PROC_ERROR_LOG VALUES (?,?,?,?,?) ,binds: ['LOAD CUSTOMER DIMENSION HUSTONS',err.code, err.state,err.message, err.stackTraceTxt] });您能否尝试在它之前返回“err”并确认它是否未定义?您是否通过 UI 中的查询历史记录页面检查了此会话中哪个查询失败?
    【解决方案2】:

    这是对 Eric 回答的补充。用作绑定变量时,不应将字符串用单引号括起来:

      var_custname = "'" + var_custname + "'";
        var t_SQLstmt = " SELECT GET_CUSTDIMKEYS(?)" ;       
    
        var t_stmt = snowflake.createStatement ({sqlText: t_SQLstmt,binds: [var_custname]});
    

    这应该是:

      //var_custname = "'" + var_custname + "'";
        var t_SQLstmt = " SELECT GET_CUSTDIMKEYS(?)" ;       
    
        var t_stmt = snowflake.createStatement ({sqlText: t_SQLstmt,binds: [var_custname]});
    

    如果将字符串类型绑定变量用单引号括起来,则单引号将成为变量的一部分。实际效果是不用像这样运行语句:

    SELECT GET_CUSTDIMKEYS('MyCustomer'); -- Looks for MyCustomer
    

    你运行这样的语句:

    SELECT GET_CUSTDIMKEYS('\'MyCustomer\''); -- Looks for 'MyCustomer'
    

    【讨论】:

    • 感谢您的提示回复我修改并尝试运行代码但同样的错误。 SQL 错误 [100183] [P0000]:存储过程 LOAD_CUSTDIM_HOUSTONS 中的执行错误:绑定参数 2undefined 的类型不受支持在 Snowflake.execute 第 51 行位置 16
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多