한 테이블의 데이터를 다른 테이블에 삽입하는 프로 시저를 작성했습니다. 엄청난 양의 데이터 (총 1 억 6 백만 행)가 있습니다. 따라서 쿼리에 커밋 간격을 지정하고 싶습니다.
정상적으로 작동하고 작업을 완료하는 데 시간이 걸리지 않는이 스크립트를 찾았지만 오류가 발생하는 이유를 모르겠습니다.
INSERT INTO dlc_pr_activity_remise
VALUES (add all values using ga_array(i).<value in select>)
오류 :
오류 (51,1) : PL / SQL : SQL 문 무시
오류 (51,47) : PL / SQL : ORA-00917 : 쉼표 누락
내 절차 :
create or replace
PROCEDURE ACTIVITY1 AS
BEGIN
DECLARE
commit_interval pls_integer := 250000 ;
uncommitted pls_integer := 0;
fetch_size pls_integer := 2500 ;
cursor g1 is SELECT prr.EVT_DECLENCHEUR ,
prr.BQ_CDF ,
prr.BQ_DOM ,
prr.NUM_COMMERCANT ,
prr.TYPE_CONTRAT_COM ,
prr.COMMERCANT_SIRET ,
prr.TYPE_PRE_COMP ,
prr.BQ_CDF_ID_EBF ,
prr.BQ_DOM_ID_EBF ,
prr.DAT_TRAITEMENT ,
prr.EVT_TYPE_OPERATION ,
prr.DEV_MT_CRE ,
prr.NBR_DECI_MT_CRE ,
prr.REF_FICHIER_TRAITE ,
prr.NUM_CTC ,
prr.REF_FICHIER_ORIGINE ,
prr.ORIGINE_FLUX ,
prr.NUM_EST_REMISE ,
prr.NUM_REMISE_ORIGINE ,
prr.NUM_MACHINE ,
prr.REF_ARCHIVAGE_REM ,
prr.DAT_REMISE ,
prr.SUPPORT_REMISE ,
prr.DAT_REMISE_CALCULEE ,
prr.DAT_VALEUR_REMISE ,
prr.COD_APPLI ,
to_date(SYSDATE,'DD/MM/YYYY')
FROM dlc_pr_remise prr
WHERE NOT EXISTS
(SELECT *
FROM DLC_PR_ACTIVITY_REMISE prao
WHERE prao.num_est_remise = prr.num_est_remise
);
TYPE GL_T is table of gl%rowtype ;
gl_array GL_T;
begin
open gl ;
loop
fetch gl
bulk collect
into gl_array
limit fetch_size ;
forall i in 1 .. gl_arary.count
INSERT INTO dlc_pr_activity_remise values(add all values using ga_array(i).<value in select>)
uncommitted :+ uncommitted + sql%rowcount ;
exit when gl_arary.count < fetch_size ;
if uncommitted >= commit_interval
then
commit ;
uncommitted := 0;
end if ;
end loop ;
commit ;
close gl;
END ;
END ACTIVITY1;
이것을 사용할 수 있습니다. 코드에 오류가 거의 없으므로 컴파일하는 동안 오류가 발생합니다. 아래 코드와 비교하여 실수 한 부분을 찾으십시오. 내 댓글은 인라인입니다.
CREATE OR REPLACE PROCEDURE ACTIVITY1
AS
fetch_size pls_integer := 100 ;
CURSOR gl
IS
SELECT prr.EVT_DECLENCHEUR,
prr.BQ_CDF,
prr.BQ_DOM,
prr.NUM_COMMERCANT,
prr.TYPE_CONTRAT_COM,
prr.COMMERCANT_SIRET,
prr.TYPE_PRE_COMP,
prr.BQ_CDF_ID_EBF,
prr.BQ_DOM_ID_EBF,
prr.DAT_TRAITEMENT,
prr.EVT_TYPE_OPERATION,
prr.DEV_MT_CRE,
prr.NBR_DECI_MT_CRE,
prr.REF_FICHIER_TRAITE,
prr.NUM_CTC,
prr.REF_FICHIER_ORIGINE,
prr.ORIGINE_FLUX,
prr.NUM_EST_REMISE,
prr.NUM_REMISE_ORIGINE,
prr.NUM_MACHINE,
prr.REF_ARCHIVAGE_REM,
prr.DAT_REMISE,
prr.SUPPORT_REMISE,
prr.DAT_REMISE_CALCULEE,
prr.DAT_VALEUR_REMISE,
prr.COD_APPLI,
TO_DATE (SYSDATE, 'DD/MM/YYYY')
FROM dlc_pr_remise prr
WHERE NOT EXISTS
(SELECT *
FROM DLC_PR_ACTIVITY_REMISE prao
WHERE prao.num_est_remise = prr.num_est_remise);
TYPE GL_T IS TABLE OF gl%ROWTYPE;
gl_array GL_T;
BEGIN
OPEN gl;
LOOP
FETCH gl BULK COLLECT INTO gl_array LIMIT fetch_size;
FORALL i IN 1 .. gl_arary.COUNT
INSERT INTO dlc_pr_activity_remise -- I assume the dlc_pr_activity_remise table has same columns which you are selectig in cursor.
VALUES gl_arary (i);
--Exit the loop when you cursor is empty.
EXIT WHEN gl%NOTFOUND;
END LOOP;
COMMIT;
CLOSE gl;
END ACTIVITY1;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다