ibmdb / node-ibm_db

IBM DB2 and IBM Informix bindings for node
MIT License
188 stars 151 forks source link

Store BSON into a BLOB using SYSTOOLS.JSON2BSON #853

Closed markddrake closed 2 years ago

markddrake commented 2 years ago

Can anyone tell me why this fails

import ibmdb  from 'ibm_db'

async function main() { 
    const cn = "DATABASE=SAMPLE;HOSTNAME=yadamu-db2;PORT=50000;PROTOCOL=TCPIP;UID=DB2INST1;PWD=oracle;"

    const conn = await new Promise((resolve,reject) => {
       ibmdb.open(cn,(err, conn) =>  {
         if (err) reject(err)
         resolve(conn)
       })
    })

    // we now have an open connection to the database, so lets get some data.

    // Execute multiple query and get multiple result sets.
    // In case of multiple resultset, query will return an array of result sets.

    const param1 = {ParamType:"ARRAY", DataType:1, Data:[4,5,6,7,8]};
    const param2 = {ParamType:"ARRAY", DataType:"DOUBLE", Data:[4.1,5.3,6.14,7,8.3]};
    const param3 = {ParamType:"ARRAY", DataType:1, Data:[0,1,false,true,0]};
    const namearr = [JSON.stringify({}),JSON.stringify([]),JSON.stringify({"AAAA":1}), JSON.stringify(["AAAA","BBBB"]), JSON.stringify({"AAA":1,"BBB":2,CCC:["X","Y"]})];

    const param4 = {ParamType:"ARRAY", DataType:"CLOB", Data:namearr, Length:32};

    // *** Use "Length: <maxDataLen>" in param Object for unequal size of data.
    // Default value is the length of first member of Array.

    var queryOptions = {sql:"insert into arrtab values (?, ?, ?, SYSTOOLS.JSON2BSON(?))", 
                        params: [param1, param2, param3, param4],
                        ArraySize:5};

    conn.querySync(`BEGIN DECLARE V_STATEMENT VARCHAR(300) DEFAULT 'drop table arrtab'; DECLARE CONTINUE HANDLER FOR SQLSTATE '42704' BEGIN  END;  EXECUTE IMMEDIATE V_STATEMENT; END;`)
    conn.querySync("create table arrtab (c1 int, c2 double, c3 boolean, c4 BLOB)");

    await new Promise((resolve,reject) => {
      conn.query(queryOptions, (err, result) => {
        if (err) reject(err)
        resolve()
      })
    })

    const data = conn.querySync("select c1,c2,c3,SYSTOOLS.BSON2JSON(c4) from arrtab");
    console.log("Selected data for table ARRTAB =\n", data);
}

main().then(() => { console.log('success')}).catch((e) => { console.log(e) })
C:\Development\YADAMU>node src\scratch\db2\test3.js
[Error: [IBM][CLI Driver][DB2/LINUXX8664] SQL0443N  Routine "JSON2BSON" (specific name "JSON2BSON") has returned an error SQLSTATE with diagnostic text "JSON parsing error for: [], error code: -1 ".  SQLSTATE=22546
] {
  error: '[ibm_db] SQL_ERROR',
  sqlcode: -443,
  state: '22546'
}
markddrake commented 2 years ago

Apparently BSON does not support ARRAY as a top level object