oracle / node-oracledb

Oracle Database driver for Node.js maintained by Oracle Corp.
http://oracle.github.io/node-oracledb/
Other
2.24k stars 1.07k forks source link

NJS-110 when using type defined as TABLE OF VARCHAR2(xxx CHAR) in thin mode #1646

Closed Xamo1297 closed 3 months ago

Xamo1297 commented 4 months ago
  1. What versions are you using?

Oracle Database 19.3 process.platform : win32 process.version: v20.10.0 process.arch x64 require('oracledb').versionString: 6.3.0 require('oracledb').oracleClientVersionString: 19.3.0.0.0 (in thick mode)

  1. Is it an error or a hang or a crash? Error

  2. What error(s) or behavior you are seeing? NJS-110: invalid Oracle type number 1 [csfrm: 129]

  3. Include a runnable Node.js script that shows the problem.

SQL:

CREATE OR REPLACE TYPE "TABLE_OF_VARCHAR2_CHAR" AS TABLE OF VARCHAR2(100 CHAR);
CREATE OR REPLACE TYPE "TABLE_OF_VARCHAR2_BYTE" AS TABLE OF VARCHAR2(100 BYTE);

Javascript:

const oracledb = require('oracledb');

async function test() {
    try {
        const connection = await oracledb.getConnection({
            user          : "user",
            password      : "pwd",
            connectString : "server/service"
        });

        try {
            try {
                await connection.getDbObjectClass("TABLE_OF_VARCHAR2_CHAR");
                console.log("Success with TABLE_OF_VARCHAR2_CHAR");
            } catch (error) {
                console.error(`Error "${error}" for TABLE_OF_VARCHAR2_CHAR`);
            }
            try {
                await connection.getDbObjectClass("TABLE_OF_VARCHAR2_BYTE");
                console.log("Success with TABLE_OF_VARCHAR2_BYTE");
            } catch (error) {
                console.error(`Error "${error}" for TABLE_OF_VARCHAR2_BYTE`);
            }
        } finally {
            await connection.close();
        }
    } catch (error) {
        console.error(`Error ${error} connecting`);
    }
}

test();

Result using thin mode:

Error "Error: NJS-110: invalid Oracle type number 1 [csfrm: 129]" for TABLE_OF_VARCHAR2_CHAR
Success with TABLE_OF_VARCHAR2_BYTE

Result using thick mode:

Success with TABLE_OF_VARCHAR2_CHAR
Success with TABLE_OF_VARCHAR2_BYTE
sudarshan12s commented 4 months ago

Thanks @Xamo1297 for informing. This will be fixed in the upcoming 6.4.0 release.

sudarshan12s commented 4 months ago

There is a patch something below which is missing in 6.3, It will be officially released as part of 6.4 with other related changes..

diff --git a/lib/thin/connection.js b/lib/thin/connection.js
index c671c1da..c1613f54 100644
--- a/lib/thin/connection.js
+++ b/lib/thin/connection.js
@@ -273,6 +273,8 @@ class ThinConnectionImpl extends ConnectionImpl {
         oraTypeNum = (attrType === constants.TNS_OBJ_TDS_TYPE_VARCHAR) ?
           constants.TNS_DATA_TYPE_VARCHAR : constants.TNS_DATA_TYPE_CHAR;
         csfrm = buf.readUInt8();
+        csfrm = csfrm & 0x7f;
+        buf.skipBytes(2);
         info.elementType = types.getTypeByOraTypeNum(oraTypeNum, csfrm);
         break;
       case constants.TNS_OBJ_TDS_TYPE_RAW:
sharadraju commented 3 months ago

@Xamo1297 This has been fixed in node-oracledb 6.4. Please confirm.

Xamo1297 commented 3 months ago

@Xamo1297 This has been fixed in node-oracledb 6.4. Please confirm.

It works correctly with v6.4, thanks