前提・実現したいこと
oralceにて、他システムで保持しているユーザー情報の移行が必要となり、
件数が膨大(数百万件)である為ストアドを作成し移行作業を行おうとしています。
概要としましては移行用のcsvファイルをloaderで移行会員TBL(MIG_CUSTOMER)に読み込み、
それを加工し複数のTBLにデータを挿入するという流れです。(CUSTOMER,ADDRESS)
移行用TBLへの読み込みは完了しています。
カーソルを作成しFOR LOOPで回し、加工して1件ずつ挿入という流れを取ったところ、
処理時間が200万件のデータで10時間を超えてしまい、チューニングに困っています。
そこでBULK INSERTなる物を使用せんと調べて実装しているのですが、
TBL間の直接のデータの移行には成功しましたがデータの加工方法がわからず苦戦しています。
下記ソースコードはコンパイルエラーとなり、FORALL文の後にはINSERT等を続けなければいけない旨はわかりましたが、
データの加工方法をご教示いただけますと幸いです。
(そもそもやろうとしていることが本当に可能なのかどうかから不明です)
よろしくお願い致します
発生している問題・エラーメッセージ
Error(50,3): PLS-00103: 記号"CUSTOMER_REC"が見つかりました。 次のうちの1つが入るとき: . ( * @ % & - + / at mod remainder rem select update with <an exponent (**)> delete insert || execute multiset save merge 記号"." は続行のために"CUSTOMER_REC"に代わりました。
該当のソースコード
-- CREATE文の一部を記載します CREATE TABLE M_MIG_CUSTOMER_BTR ( CUSTOMER_CODE NUMBER(12,0) ) / CREATE INDEX M_CUSTOMER_IDX2 ON M_MIG_CUSTOMER_BTR (CUSTOMER_CODE) --- CREATE TABLE CUSTOMER ( CUSTOMER_ID VARCHAR2(12) NOT NULL, OLD_CUSTOMER_ID VARCHAR2(13) ) / ALTER TABLE CUSTOMER ADD(CONSTRAINT PK_CUSTOMER PRIMARY KEY (CUSTOMER_ID) USING INDEX) --- CREATE OR REPLACE PROCEDURE BULK_INSERT IS BULK_SIZE PLS_INTEGER := 1000; CURSOR CSR_CUSTOMER IS SELECT * FROM MIG_CUSTOMER ORDER BY CUSTOMER_CODE ASC ; TYPE CSR_CUSTOMER_REC IS TABLE OF CSR_CUSTOMER%ROWTYPE; TYPE CUSTOMER_REC IS TABLE OF CUSTOMER%ROWTYPE; V_CSR_CUSTOMER_REC CSR_CUSTOMER_REC; V_CUSTOMER_REC CUSTOMER_REC; -- エラーハンドラ用 vBulkErrors PLS_INTEGER := 0; eBulkProcessNotComplete EXCEPTION; PRAGMA EXCEPTION_INIT(eBulkProcessNotComplete, -24381); BEGIN OPEN CSR_CUSTOMER; LOOP FETCH CSR_CUSTOMER BULK COLLECT INTO V_CSR_CUSTOMER_REC LIMIT BULK_SIZE; -- BULK FETCH 処理 EXIT WHEN V_CSR_CUSTOMER_REC.COUNT = 0; DBMS_OUTPUT.PUT_LINE('バルクインサート対象件数:' || V_CSR_CUSTOMER_REC.COUNT); BEGIN -- BULK INSERT 処理 FORALL i in 1..V_CSR_CUSTOMER_REC.COUNT SAVE EXCEPTIONS -- 会員情報セット(ここの処理の記述方法が不明) CUSTOMER_REC(i).CUSTOMER_ID := '9999999999'; CUSTOMER_REC(i).OLD_CUSTOMER_ID := LPAD(V_CSR_CUSTOMER_REC(i).CUSTOMER_CODE,10,'0'); INSERT INTO CUSTOMER VALUES V_CSR_CUSTOMER_REC(i); COMMIT; EXCEPTION WHEN eBulkProcessNotComplete THEN vBulkErrors := vBulkErrors + SQL%BULK_EXCEPTIONS.COUNT; -- PROC_BULK_ERROR_HANDLER; END; END LOOP; CLOSE CSR_CUSTOMER; END;
試したこと
加工せずそのままの値を移植するように記述した際は正常に動作確認ができました。
補足情報(FW/ツールのバージョンなど)
実際に行いたい加工の項目は100を超えるため割愛しています。
CUSTOMER.CUSTOMER_IDは本来主キーですが、動作確認の為固定値を入れています。
(余分な処理は記載せず、一意制約エラーまで行くのを確認したい為)
ADDRESSへの挿入は割愛していますが、同様にMIG_CUSTOMERから取得した物を加工して挿入したいです。
複数TBLへのINSERT処理を同時に行いたいと思っています。
(CUSOTOMER_RECに情報を詰めた後はADDRESS_RECに情報を詰め、連続してINSERTするイメージ)

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2019/05/15 04:02
2019/05/15 04:58
2019/05/15 05:04
2019/05/15 05:54
2019/05/15 06:17 編集
2019/05/15 06:31
2019/05/16 02:28