Oracle 在具有不同游标的同一表上插入数据

Oracle 在具有不同游标的同一表上插入数据,oracle,plsql,oracle11g,cursor,plsqldeveloper,Oracle,Plsql,Oracle11g,Cursor,Plsqldeveloper,我试图用3个不同的游标执行一个过程,从同一个表中获取数据 第一个光标仅获取收款,第二个光标获取发票,第三个光标获取贷方票据 create or replace procedure COMISIONCALCULO IS CURSOR COB IS SELECT ASIENTOCONTABLE, fedocoriginal2, importedebe FROM INFGENERAL

我试图用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;
我加入游标是因为费用影响一张或多张账单,而这些账单有一张或多张信用票据

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)
   ) ;
问题是,当我尝试运行该过程时,它会标记我 “没有足够的值编译失败” 此错误标记在插入的行上

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;
这里的问题是,当所选数据具有不同的列时,如何将它们从源表插入到最终表中?这些列应该有相同的名称吗?我可以只插入插入一次吗

请帮忙

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

如果想要一条记录,只需插入一条即可

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

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”
编译失败


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

INSERT语句中的字段少于要插入的表中的字段,并且INSERT语句中没有字段列表,因此不清楚游标中的哪些字段应该进入INFOFINAL上的各个字段。我怀疑您可以使用单个光标和单个插入,但由于我无法计算字段应如何匹配,因此我无法提出建议。可能是重复的我尝试过这样做,但他向我发送了以下错误。PLS-00302:组件“IMPORTEHABERNOTA”必须声明编译失败。PL/SQL:ORA-00984:此处不允许列编译失败。我的问题是,是否存在列名称不同的问题?那么
INFGENERAL
表中的哪个列映射到
INFOFINAL.IMPORTEHABERNOTA
?这是你的数据模型,你应该知道,因为互联网上一些随机的陌生人向你解释的机会是零。