3

nodeJs アプリケーションで node-oracledb ドライバーを使用しています。一括挿入 (最大 6000 行) を行う必要があり、 simple-oracledb拡張機能のバッチ挿入機能は私のニーズを満たしていませんでした。6000 レコードでは非常に遅いです。しかし、node-oracledb からこの投稿このドキュメントに出くわしましたが、有望な方法のようです。その方法を理解していないのは、PL/SQLに慣れていないだけです。

したがって、次の表があると考えてください。

CREATE TABLE MY_TABLE 
( "CID" NUMBER,
"EMPID" VARCHAR2(10 BYTE));

一括挿入用のレコードが 3 つあります。これが私のPL/SQLパッケージです:

CREATE OR REPLACE PACKAGE MY_PKG IS
  TYPE cidtype IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  TYPE empidtype IS TABLE OF VARCHAR2(10);
  PROCEDURE insertproc(cids IN cidtype, empids IN empidtype);
END;
/

CREATE OR REPLACE PACKAGE BODY MY_PKG IS

  PROCEDURE insertproc(cids IN cidtype, empids IN empidtype) IS
  BEGIN
    FORALL i IN INDICES OF cids
      INSERT INTO MY_TABLE (cid, empid) VALUES (cids(i), empids(i));
  END;

END;
/

私のNodeJSコード:

var stmt = `BEGIN MY_PKG.insertproc(:cids, :empids); END;`;
var params = {
    cids: {
        type: oracledb.NUMBER,
        dir: oracledb.BIND_IN,
        val: [100, 101, 102]
    },
    empids: {
        type: oracledb.STRING,
        dir: oracledb.BIND_IN,
        val: ['ab165634', 'df123456', 'cd456789']
    }
};

connection.execute(stmt,params,function (err) { . . . });

ただし、これにより次のエラーがスローされます。

ORA-06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to 'INSERTPROC'\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored\n

この例では、配列を 1 列にバインドする方法しか示していないため、複数の列 (行全体) に対してそれがどのように行われるかを理解できませんでした。どんな助けでも大歓迎です!!!

4

3 に答える 3