PL/SQL ¤Ë¤è¤ë¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È½èÍý
¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È½èÍý (BULK INSERT:FORALL ¹½Ê¸) ¤Ï 1 ²ó¤Î¥³¥ó¥Æ¥¥¹¥È¥¹¥¤¥Ã¥Á¤ÇÂçÎ̤Υ쥳¡¼¥É¤ò½èÍý¡Ê¥Ð¥ë¥¯½èÍý¡Ë¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
¤³¤Î¥³¥ó¥Æ¥¥¹¥È¥¹¥¤¥Ã¥Á¡ÊPL/SQL ¥¨¥ó¥¸¥ó¤È SQL ¥¨¥ó¥¸¥ó¤Î´Ö¤ÇȯÀ¸¤¹¤ë½èÍý¤Î¤ä¤ê¼è¤ê¡Ë
¤Î²ó¿ô¤ò¸º¤é¤¹¤³¤È¤Ë¤è¤Ã¤ÆÂçÎ̥ǡ¼¥¿¤Î½èÍý»þ¤Î¥ì¥¹¥Ý¥ó¥¹¤ò¸þ¾å¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ë¡£
¤³¤Î¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥ÈÎã¤Ç¤Ï¥Ð¥ë¥¯¥Õ¥§¥Ã¥Á¡Ê¼è¤ê½Ð¤·¡Ë¤È¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤Ë
¥ì¥³¡¼¥É·¿ ¤Î ¥³¥ì¥¯¥·¥ç¥ó ¤ò
»ÈÍѤ·¤Æ¤¤¤ë¡£¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤ËÂФ·¤Æ¥ì¥³¡¼¥É·¿¤ò»ÈÍѤǤ¤ë¤Î¤Ï Oracle 9i °Ê¹ß¤È¤Ê¤ë¡£
Oracle 8i °ÊÁ°¤Ç¤Î¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È½èÍý
Oracle 8i °ÊÁ°¤Ç¤Ï¥ì¥³¡¼¥É·¿¤Ë¤è¤ë¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤Ë¤ÏÂбþ¤·¤Æ¤¤¤Ê¤¤¡£
¥Õ¥£¡¼¥ë¥É¿ô¤¬Â¿¤¤¤È¤ä¤äÌÌÅݤˤʤ뤬¡¢¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È½èÍý¼«ÂÎ¤Ï Oracle 8i ¤Ç¤âµ½Ò¤Ç¤¤ë¤¬¡¢Ã±°ì¥Ç¡¼¥¿·¿¤Ë¤è¤ë¥³¥ì¥¯¥·¥ç¥ó¤òÊ£¿ô¸ÄÍѤ¤¤ë¤³¤È¤Ç¼ÂÁõ¤¹¤ë¤³¤È¤¬²Äǽ¡£
¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤Ë»È¤¦É½ÄêµÁ
ɽÄêµÁ¤Ï SQL ÆþÌç ¤Î¥Æ¡¼¥Ö¥ëÄêµÁ¤òήÍѤ·¤Æ¹Ô¤Ê¤¦¡£¤µ¤é¤Ë¥¤¥ó¥µ¡¼¥È½èÍýÍѤ˰ʲ¼¤Îºî¶È¤ò¹Ô¤Ê¤¦¡£
CREATE TABLE RIVUS.USER_MASTER_COPY AS SELECT * FROM RIVUS.USER_MASTER WHERE 1=0;
ALTER TABLE RIVUS.USER_MASTER_COPY ADD PRIMARY KEY (USER_ID);
¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤ÎÎã ¡ÊFOR ALL¡Ë
¥Ð¥ë¥¯¥Õ¥§¥Ã¥Á ¤ò¹Ô¤Ê¤Ã¤¿ ¥³¥ì¥¯¥·¥ç¥ó ¤ò¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤¹¤ë¡£
¥Ð¥ë¥¯½èÍý¤ÎÅÓÃæ¤ÇȯÀ¸¤·¤¿¥¨¥é¡¼¤Ï eBulkProcessNotComplete ¤ÇÎã³°½èÍý¤·(¢¨)·Ñ³½èÍý¤¹¤ë ¡£¡ÊSAVE EXCEPTIONS ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ½ªÎ»¤·¤Ê¤¤¡Ë
(¢¨) Îã³°½èÍýÉô¤Î¼ÂÁõ¤Ï¹Ô¤Ê¤Ã¤Æ¤¤¤Ê¤¤¡£°ÅÌÛ¥«¡¼¥½¥ë SQL%BULK_EXCEPTIONS ÇÛÎó¤ò»ÈÍѤ¹¤ë¤³¤È¤ÇÎã³°¤ÎȯÀ¸¤·¤¿Í×ÁÇÈÖ¹æ¤È¥¨¥é¡¼¥³¡¼¥É¤¬¼èÆÀ¤Ç¤¤ë¡£
CREATE OR REPLACE PROCEDURE RIVUS.BULK_FETCH_INSERT2
IS
BULK_SIZE CONSTANT NUMBER := 4 ; -- ¥³¥ó¥¹¥¿¥ó¥È¤Ç¤Ê¤¯¤Æ¤âÎɤ¤
CURSOR cIDName IS
SELECT * FROM USER_MASTER ORDER BY 1 ;
TYPE tIDNAMES IS TABLE OF cIDName%ROWTYPE INDEX BY BINARY_INTEGER;
-- ¢¬ ¥«¡¼¥½¥ëÄêµÁ¤Ë¤è¤ë¥ì¥³¡¼¥É·¿¤Î¥³¥ì¥¯¥·¥ç¥ó¡Ê·ë¹çÇÛÎó¡Ë
vIDName tIDNAMES;
-- ¥¨¥é¡¼¥Ï¥ó¥É¥éÍÑ ORA-24381: DMLÇÛÎó¤Ë¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹¡£
vBulkErrors PLS_INTEGER := 0 ;
eBulkProcessNotComplete EXCEPTION;
PRAGMA EXCEPTION_INIT( eBulkProcessNotComplete, -24381 ) ;
BEGIN
-- ºÆ»î¹Ô¤È¥¨¥é¡¼¥Æ¥¹¥ÈÍÑ
-- DELETE FROM USER_MASTER_COPY;
-- COMMIT;
OPEN cIDName;
LOOP
FETCH cIDName BULK COLLECT INTO vIDName LIMIT BULK_SIZE;
-- BULK FETCH ½èÍý
DBMS_OUTPUT.PUT_LINE
( '¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥ÈÂоݷï¿ô:' || vIDName.
COUNT ) ;
BEGIN
-- BULK INSERT ½èÍý
FORALL i in
1 ..vIDName.
COUNT SAVE EXCEPTIONS
-- ¢« ¥¨¥é¡¼¤¬È¯À¸¤·¤Æ¤â·Ñ³ INSERT INTO USER_MASTER_COPY VALUES vIDName( i) ;
-- Oracle 9i ¤«¤é»ÈÍѤǤ¤ëµ½Ò ¢¬
COMMIT;
EXCEPTION
WHEN eBulkProcessNotComplete THEN
vBulkErrors := vBulkErrors + SQL%BULK_EXCEPTIONS.
COUNT ;
-- PROC_BULK_ERROR_HANDLER;
END;
EXIT WHEN cIDName%NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE( '½èÍý·ï¿ô:' || cIDName%ROWCOUNT) ;
DBMS_OUTPUT.PUT_LINE( '¥¨¥é¡¼¿ô:' || vBulkErrors) ;
CLOSE cIDName;
END;
/
º÷°ú¤¬ÉÔϢ³¤Ê¥³¥ì¥¯¥·¥ç¥ó¤ËÂФ¹¤ë¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È
FORALL ¹½Ê¸¡ÊFOR ¤È ALL ¤Ë¥¹¥Ú¡¼¥¹¤Ê¤·¡Ë¤ò»ÈÍѤ¹¤ë¤Ë¤ÏϢ³¤·¤¿º÷°ú¤ò¤â¤Ä ¥³¥ì¥¯¥·¥ç¥ó·¿ ¤Ç¤¢¤ë¤³¤È¤¬¾ò·ï¤Ç¤¢¤Ã¤¿¤¬ Oracle 10g ¤«¤é¥³¥ì¥¯¥·¥ç¥ó¤Î°ìÉô¤ò DELETE ¤·¤¿º÷°ú¤¬ÉÔϢ³¤Ê¥³¥ì¥¯¥·¥ç¥ó¤Ç¤âº÷°ú¤òºÆ¹½ÃÛ¤»¤º¤Ë ¥Ð¥ë¥¯¥¤¥ó¥µ¡¼¥È¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
FORALL index IN INDICES OF collection ... / FORALL index IN VALUES OF collection ... ¹½Ê¸
INDICES OF*1 ¤Ïº÷°úÉô¤ò VALUES OF ¤Ï¥³¥ó¥Æ¥ó¥ÄÉô¤ò¼è¤ê½Ð¤¹¤¿¤á¤Î½Ò¸ì¤È¤Ê¤ê¡¢¾å¤Î¥µ¥ó¥×¥ëÎã¤Î¥Ð¥ë¥¯½èÍýÉô¤ò½ñ¤´¹¤¨¤Æ¾¯¤·¥¢¥ì¥ó¥¸¤ò²Ã¤¨¤ë¤È¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡£
.....
-- BULK INSERT ½èÍý
FORALL i in INDICES OF vIDName BETWEEN 5 AND 10 SAVE EXCEPTIONS
-- ¢¬¢¬ IN INDICES OF .. [BETWEEN n AND m] [SAVE EXCEPTIONS]
INSERT INTO USER_MASTER_COPY VALUES vIDName( i) ;
.....
´ØÏ¢»ö¹à