【问题标题】:Insert from one table into another with commit Intervals使用提交间隔从一个表插入另一个表
【发布时间】:2017-03-29 08:08:37
【问题描述】:

我编写了一个将数据从一个表插入到另一个表的过程。数据量巨大——总共有 1.06 亿行。所以我想在查询上设置一个提交间隔。

我发现这个脚本通常可以正常工作并且不需要时间来完成工作,但我不知道为什么会出现错误

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;

【问题讨论】:

  • 您获得了满足您的要求所需的一切。如果你遇到一些问题,你为什么不试一试然后上来。执行@codemonkey 的建议,然后在遇到任何问题时发布问题
  • 是的,我正在尝试这样做我只有一个错误:INSERT INTO dlc_pr_activity_remise 值(使用 ga_array(i) 添加所有值。)
  • 它说语句被忽略并且缺少逗号我不知道为什么对我来说所有的 semms 都是好的
  • 你能编辑你的问题并把你试过的代码和你得到的错误。
  • @XING 你知道什么会导致这个吗,因为对我来说它应该可以工作!!

标签: sql stored-procedures plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

你可以使用它。您的代码中几乎没有错误,这就是您在编译时遇到错误的原因。请将您的代码与下面的代码进行比较,找出您犯错的地方。我的 cmets 是内联的。

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;

【讨论】:

  • 我有 2 个错误 Error(41,26): PLS-00201: identifier 'GL' must be declared and Error(50,24): PLS-00201: identifier 'GL_ARARY.COUNT' must be宣布!
  • 我刚刚复制了你的代码。光标名称最初是 g1,后来您将其用作 gl。再次运行..我修改了代码
  • 非常感谢你 Xing 现在它编译没有错误,在你写的程序中提交间隔是 100 ??
  • 我希望你希望你的程序是高效的。不是吗?现在你可以在这里阅读为什么我放 100。stackoverflow.com/questions/38659739/…
  • 我明白你为什么现在放 100 非常感谢 XING,我希望我的 1 亿行不会需要 3 天时间:D
【解决方案2】:
cursor g1 is select acct_nbr from dwc_tmp_acct_rcvbl;

上面的光标选择必须替换为:

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
    )

那么,这一行:

insert into dwc_tmp_acct_rcvbl_year_col (acct_nbr) 

必须替换为

INSERT INTO dlc_pr_activity_remise values(add all values using ga_array(i).<value in select>)

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    未提交的增量需要是 未提交 := 未提交 + sql%rowcount ;

    不像帖子中的那样 未提交 :+ 未提交 + sql%rowcount ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      相关资源
      最近更新 更多