使用不同的游标将数据插入同一表

时间:2018-06-24 00:09:47

标签: oracle plsql oracle11g cursor plsqldeveloper

我正在尝试使用3个不同的游标执行一个过程,从同一张表中获取数据。

第一个光标仅获取收款,第二个光标获取发票,第三个光标获取贷方通知单。

create or replace procedure COMISIONCALCULO
IS 
    CURSOR COB IS 
         SELECT ASIENTOCONTABLE, 
                fedocoriginal2, 
                importedebe 
         FROM INFGENERAL 
         WHERE TIPODEASIENTO2 = 'Cobro';

cursor FACT (P1 IN VARCHAR2) is 
      select IDCOMPESACION, 
             ASIENTOCONTABLE, 
             FEDOCORIGINAL2, 
             FEVENCIMIENTO,
             IDDOCORIGINAL
     FROM INFGENERAL
     WHERE TIPODEASIENTO2 in ('Migración de datos','Factura de cliente')
    AND ASIENTOCONTABLE =P1;

CURSOR NOTAS (P1 IN VARCHAR2) IS 
     SELECT fecontabilizacion,
            fedocoriginal,
            iddocoriginal,
            tipodeasiento2,
            importedebe
     FROM INFGENERAL 
     WHERE TIPODEASIENTO2 = 'Nota de crédito de cliente'
     AND IDDOCORIGINAL= P1;

我之所以加入光标,是因为费用影响一个或多个账单,而这些账单具有一个或多个贷方通知单。

在定义游标时,我添加了变量P1。

我想将获取的所有数据保存在另一个表中,但保存为一条记录。除了最终表的列与源表的列不同之外。

来源表:

CREATE TABLE  "INFGENERAL" 
   (    "CLIENTE" VARCHAR2(60), 
    "FECONTABILIZACION" VARCHAR2(60), 
    "FEDOCORIGINAL" VARCHAR2(60), 
    "FEVENCIMIENTO" VARCHAR2(60), 
    "TIPODEASIENTO" VARCHAR2(60), 
    "ASIENTOCONTABLE" VARCHAR2(60), 
    "ASIENTOCONTCOM" VARCHAR2(60), 
    "IDCOMPESACION" VARCHAR2(60), 
    "IDDOCORIGINAL" VARCHAR2(60), 
    "REFEXTERNA" VARCHAR2(60), 
    "ESTADO" VARCHAR2(60), 
    "IDFACTURA" VARCHAR2(60), 
    "FECHACOMPENSACION" VARCHAR2(60), 
    "IDDOCREF" VARCHAR2(60), 
    "IMPORTEPENDIENTE" VARCHAR2(60), 
    "IMPORTEDEBE" VARCHAR2(60), 
    "IMPORTEHABER" VARCHAR2(60), 
    "TIPODEASIENTO2" VARCHAR2(60), 
    "FEDOCORIGINAL2" VARCHAR2(60), 
    "FEVENCIMIENTO2" VARCHAR2(60)
   ) ;

最终表:

CREATE TABLE  "INFOFINAL" 
   (    "ASIENTOCONTABLE" VARCHAR2(60), 
    "FECHACOBRO" DATE, 
    "IMPORTECOBRO" VARCHAR2(60), 
    "IDCOMPESACION" VARCHAR2(60), 
    "IDDOCORIGINAL" VARCHAR2(60), 
    "FECHAORIGFACT" DATE, 
    "FECHAVENFACT" DATE, 
    "IMPORTEHABERNOTA" VARCHAR2(60)
   ) ;

问题是,当我尝试运行该过程时,它会标记我 “没有足够的valuesCompilation失败” 该错误标记在插入的行上。

BEGIN 
    FOR I IN COB LOOP
        INSERT INTO INFOFINAL 
        VALUES (I.ASIENTOCONTABLE, I.FECHACOBRO, I.IMPORTECOBRO);

        FOR J IN FACT(I.ASIENTOCONTABLE) LOOP
            INSERT INTO INFOFINAL 
            VALUES(J.IDCOMPESACION,J.IDDOCORIGINAL, J.FECHAORIGFACT, J.FECHAVENFACT);
            FOR H IN NOTAS(J.IDDOCORIGINAL) LOOP
                INSERT INTO INFOFINAL 
                VALUES(H.IMPORTEHABERNOTA);
                CNOTA:= CNOTA + 1;
            END LOOP;

            CFACT := CFACT + 1;
    END LOOP;
    CCOB:= CCOB + 1;
    END LOOP;

END;

这里的问题是,当列中的列不同时,如何将所选数据从源表插入到最终表中?这些列应该具有相同的名称吗?我只能插入一次插入内容吗?

请帮助。

1 个答案:

答案 0 :(得分:0)

  

“我想将在另一个表中获得的所有数据保存为一条记录”

如果只需要一条记录,则只需插入一个即可。

内部循环从其外部循环继承作用域,因此您可以从最内部的循环引用所有三个游标,如下所示:

BEGIN 
    FOR I IN COB LOOP

        FOR J IN FACT(I.ASIENTOCONTABLE) LOOP

            FOR H IN NOTAS(J.IDDOCORIGINAL) LOOP
                INSERT INTO INFOFINAL 
                VALUES(I.ASIENTOCONTABLE, 
                       I.FECHACOBRO, 
                       I.IMPORTECOBRO, 
                       J.IDCOMPESACION,
                       J.IDDOCORIGINAL, 
                       J.FECHAORIGFACT, 
                       J.FECHAVENFACT,
                       H.IMPORTEHABERNOTA);
                CNOTA:= CNOTA + 1;
            END LOOP;

            CFACT := CFACT + 1;
        END LOOP;
        CCOB:= CCOB + 1;
    END LOOP;

END; 

  

PLS-00302:必须声明组件“ IMPORTEHABERNOTA”
  编译失败。

事实证明,源表IMPORTEHABERNOTA上没有列INFGENERAL。因此,此版本的程序将不起作用。桌上没有其他明显的候选人,因此我们无法确定如何修复CURSOR NOTAS。 OP需要利用他们对数据模型的理解来解决这个问题。

相关问题