使用用户定义的类型数组作为参数

问题描述

我正在尝试使用锚定到用户定义类型数组的参数来调用存储过程。我正在使用node-ibm_db npm模块。我尝试遵循在node_modules / ibm_db / test / 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,C4 FROM UNnesT(P_ARRAY) AS (C1,C4); END")
  if(err.length) { console.log(err); return; }

  var paramC1 = {ParamType:"ARRAY",DataType:1,Data:[0,1,2]}
  var paramC2 = {ParamType:"ARRAY",Data:[19,20,18]}
  var paramC3 = {ParamType:"ARRAY",Data:['Y','N','Y']}
  var paramC4 = {ParamType:"ARRAY",DataType:"VARCHAR",Data:['BMWX','TESL','TOYO'],Length:4} 
  var final = {ParamType:"ARRAY",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,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,c4 varchar(10))
1.18 ::  odbc.js:querySync() =>  CREATE OR REPLACE TYPE SAMPLE_TYPE AS ROW ( C1 INTEGER,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,C4); END
1.271 ::  odbc.js:querySync() =>  insert into arrtab values (9,'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,C4: 'rock' } ]
1.367 ::  odbc.js:querySync() =>  drop table arrtab

有人知道甚至有可能这样做吗?我认为这是一个常见的用例,当我们仍在使用mybatis和java时,我们曾经很容易地处理此问题。任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)