2017-10-26 12 views
1

내 nodeJs 응용 프로그램에서 node-oracledb 드라이버를 사용하고 있습니다. 대량 삽입 (6000 행까지)을 수행해야하고 simple-oracledb 확장 배치 기능이 내 요구를 충족시키지 못했습니다. 그것은 6000 기록을 위해 고통스럽게 느립니다. 나는 노드 -oracledb에서이 postthis doc을 발견했지만, 유망한 방법처럼 보입니다. PL/SQL에 익숙하지 않아서 어떻게해야하는지 이해하지 못했습니다.node-oracledb - 연관 배열을 사용한 벌크 삽입

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 코드 : 만이 유 배열을 바인딩하는 방법을 보여줍니다 예부터

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 

:

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) { . . . }); 

그러나 이것은 다음과 같은 오류가 발생합니다 1 열의 경우, 여러 행 (전체 행)에서 행해진 결과를 파악할 수 없었습니다. 어떤 도움을 주시면 대단히 감사하겠습니다 !!!

+0

'TYPE의 cidtype는 BINARY_INTEGER BY MY_TABLE.CID %의 타입 인덱스의 테이블; TYPE empidtype은 BINARY_INTEGER BY MY_TABLE.EMPID % TYPE INDEX 테이블입니다. – MT0

답변

0

나는 조금 about this here을 이야기하지만, 정말 당신이 당신의 empidtype 유형에 "BINARY_INTEGER에 의해 INDEX"를 추가하면

귀하의 코드가 작동합니다 ... 더 많은 예제가 필요합니다. 이는 중첩 된 테이블에서 연관 배열로 바꿉니다. 이는 드라이버가 현재 바인딩 할 수있는 것입니다. 일괄 (두 번째 예)이 작업을 수행하는 방법을 보여주는 또 다른 How to insert multiple records into oracle db using node js

그리고 :

는 여기에 내가 대답 비슷한 질문 Node.js + OracleDb - Insert the last date many times

일괄 처리는 지금 with async/await 훨씬 쉬울 것이다.

마지막으로 (I 약속), 흥미로운이 슬라이드를 찾을 수 있습니다 : https://www.dropbox.com/s/69jt5uu1fqus84c/Tips%20and%20Tricks%20for%20Getting%20Started%20with%20the%20Oracle%20Database%20Driver%20for%20Node.pdf?dl=0