Javascript 使用用户定义的类型数组作为参数在nodejs中调用DB2存储过程

Javascript 使用用户定义的类型数组作为参数在nodejs中调用DB2存储过程,javascript,node.js,db2,db2-luw,Javascript,Node.js,Db2,Db2 Luw,我正在尝试调用一个存储过程,其中的参数锚定到用户定义的类型数组。我正在使用node-ibm\u db npm模块。我试着按照节点\u modules/ibm\u db/test/test-array-insert.js中的示例进行操作 我根据在ibm_db测试程序中找到的概念,提出了我的示例测试程序 var common = require("./common") , ibmdb = require("../") , schema = co

我正在尝试调用一个存储过程,其中的参数锚定到用户定义的类型数组。我正在使用node-ibm\u db npm模块。我试着按照节点\u modules/ibm\u db/test/test-array-insert.js中的示例进行操作

我根据在ibm_db测试程序中找到的概念,提出了我的示例测试程序

    var common = require("./common")
  , ibmdb = require("../")
  , schema = common.connectionObject.CURRENTSCHEMA
  , insertCount = 0;
  ;

ibmdb.debug(true);
ibmdb.open(common.connectionString, function(err, conn) {
  if(err) {
    console.log(err);
    return;
  }

  conn.querySync("create table arrtab (c1 INTEGER, c2 INTEGER, c3 char(1), c4 varchar(10))");
  conn.querySync("CREATE OR REPLACE TYPE SAMPLE_TYPE AS ROW ( C1 INTEGER, C2 INTEGER, C3 char(1), C4 VARCHAR(10))");
  conn.querySync("CREATE OR REPLACE TYPE SAMPLE_ARR AS SAMPLE_TYPE ARRAY[100]");
 
  err = conn.querySync("CREATE OR REPLACE PROCEDURE TEST_TYPE ( IN P_ARRAY SAMPLE_ARR) BEGIN INSERT INTO ARRTAB (C1,C2,C3,C4) SELECT C1,C2,C3,C4 FROM UNNEST(P_ARRAY) AS (C1,C2, C3, C4); END")
  if(err.length) { console.log(err); return; }

  var paramC1 = {ParamType:"ARRAY", DataType:1, Data:[0,1,2]}
  var paramC2 = {ParamType:"ARRAY", DataType:1, Data:[19,20,18]}
  var paramC3 = {ParamType:"ARRAY", DataType:1, Data:['Y','N','Y']}
  var paramC4 = {ParamType:"ARRAY", DataType:"VARCHAR", Data:['BMWX','TESL','TOYO'], Length:4} 
  var final = {ParamType:"ARRAY", DataType:1, Data: [paramC1,paramC2,paramC3,paramC4]}


  conn.querySync("insert into arrtab values (9, 4, 'Y', 'rock')");
  if(err.length) { console.log(err); return; }

  var data = conn.querySync("select * from arrtab");
  console.log("\nSelected data for table ARRTAB =\n", data);

 var queryOptions = { sql: "call test_type(?)",
                      params: [final],
                      ArraySize:3}
//   var queryOptions = {sql: "insert into arrtab values (?,?,?,?)",
//                       params: [paramC1, paramC2, paramC3, paramC4],
//                       ArraySize: 3}
  err = conn.querySync(queryOptions);
  console.log(err)

  var data = conn.querySync("select * from arrtab");
  console.log("\nSelected data for table ARRTAB =\n", data);
  conn.querySync("drop table arrtab");

});
基本上,用例是我将传递一组表数据到存储过程以进行保存。为此,我创建了一个udt行和一个基于udt行的udt数组。ibm_db似乎无法接受复杂的数组参数

C:\Users\r\Documents\Github\test>node node_modules\ibm_db\test\test-array-sp2.js    
node-ibm_db logs enabled.
1.11 ::  odbc.js:querySync() =>  create table arrtab (c1 INTEGER, c2 INTEGER, c3 char(1), c4 varchar(10))
1.18 ::  odbc.js:querySync() =>  CREATE OR REPLACE TYPE SAMPLE_TYPE AS ROW ( C1 INTEGER, C2 INTEGER, C3 char(1), C4 VARCHAR(10))1.239 ::  odbc.js:querySync() =>  CREATE OR REPLACE TYPE SAMPLE_ARR AS SAMPLE_TYPE ARRAY[100]
1.25 ::  odbc.js:querySync() =>  CREATE OR REPLACE PROCEDURE TEST_TYPE ( IN P_ARRAY SAMPLE_ARR) BEGIN INSERT INTO ARRTAB (C1,C2,C3,C4) SELECT C1,C2,C3,C4 FROM UNNEST(P_ARRAY) AS (C1,C2, C3, C4); END
1.271 ::  odbc.js:querySync() =>  insert into arrtab values (9, 4, 'Y', 'rock')
1.287 ::  odbc.js:querySync() =>  select * from arrtab

Selected data for table ARRTAB =
 [ { C1: 9, C2: 4, C3: 'Y', C4: 'rock' } ]
1.316 ::  odbc.js:querySync() =>  call test_type(?)
Error: [IBM][CLI Driver][DB2/NT64] SQL0301N  The value of input variable, expression or parameter number "1" cannot be used because of its data type.  SQLSTATE=07006

    at Database.querySync (C:\Users\r\Documents\Github\test\node_modules\ibm_db\lib\odbc.js:793:30)
    at C:\Users\r\Documents\Github\test\node_modules\ibm_db\test\test-array-sp2.js:40:14
    at C:\Users\r\Documents\Github\test\node_modules\ibm_db\lib\odbc.js:111:11
    at C:\Users\r\Documents\Github\test\node_modules\ibm_db\lib\odbc.js:333:11 {
  error: '[node-ibm_db] Error in ODBCConnection::QuerySync while executing query.',
  sqlcode: -301,
  state: '07006'
}
1.362 ::  odbc.js:querySync() =>  select * from arrtab

Selected data for table ARRTAB =
 [ { C1: 9, C2: 4, C3: 'Y', C4: 'rock' } ]
1.367 ::  odbc.js:querySync() =>  drop table arrtab

有人知道是否有可能做到这一点吗?我认为这是一个常见的用例,当我们仍然使用mybatis和java时,我们很容易处理这个问题。任何帮助都将不胜感激。

错误表明输入数据类型不兼容。为什么数组大小为3,并且数组有四个条目?好的,有一点上下文。我应该从这个开始。ibm_db github页面中出现了一个问题。引入了一项新功能,可通过使用阵列实现批量插入。但是他们提供的示例都具有按列绑定的特性,这意味着如果您有一个包含两列的表,则需要有两个单独的数组,以便绑定到参数标记。我提出了一个问题,是否可以使用表类型作为参数,这可以通过sql实现,如示例存储过程中所示。简言之,数组大小3是数组长度所必需的。我猜我正在寻找行绑定,这是odbc的一个特性。除非我对参数绑定的理解完全错误。存储过程需要输入参数,但不提供参数,这是一个与
node-ibm_db
功能无关的单独错误。提供空数组或填充的数组。对于
node-ibm_db
而言,最好通过github而不是stackoverflow进行此操作。该参数通过传递给querySync api的queryOptions对象提供。将对象“final”作为查询选项的参数。事实上,我希望有人已经偶然发现了我类似的用例,我把它发布在这里,因为这个网站比项目的github页面有更广的覆盖范围。项目维护人员没有真正的反应,我只看到一个人回答了所有的问题,而且似乎不是所有的问题都得到了回答,特别是后续问题。