【问题标题】:Insert data on the same table with different cursors用不同的游标在同一张表上插入数据
【发布时间】:2018-12-02 23:56:22
【问题描述】:

我正在尝试使用 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)
   ) ;

问题是当我尝试运行它标记我的程序时 “没有足够的值编译失败” 此错误在插入的行上标记。

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;

这里的问题是,当它们有不同的列时,如何将源表中的选定数据插入到最终表中?列应该具有相同的名称吗?我可以只插入一次插页吗?

请帮忙。

【问题讨论】:

  • INSERT 语句中的字段比要插入的表中的字段少,并且您没有在 INSERT 中包含字段列表,因此不清楚游标中的哪些字段是应该进入 INFOFINAL 的各个领域。我怀疑您可以使用单个光标和单个 INSERT,但因为我无法弄清楚这些字段应该如何匹配,所以我无法提出建议。

标签: oracle plsql oracle11g cursor plsqldeveloper


【解决方案1】:

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

如果你想要一条记录,你只需要一个插入。

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

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。所以这个版本的程序将不起作用。桌上没有明显的其他候选人,所以我们无法确定如何修复CURSOR NOTAS。 OP 需要利用他们对数据模型的理解来解决这个问题。

【讨论】:

  • 我尝试这样做,但他向我发送了以下错误。 PLS-00302:必须声明组件“IMPORTEHABERNOTA”编译失败。 PL / SQL: ORA-00984: column not allowed here 编译失败。我的问题是,是否存在列名称不同的问题?
  • 那么INFGENERAL 表中的哪一列映射到INFOFINAL.IMPORTEHABERNOTA?这是您的数据模型,您应该知道,因为互联网上的某个随机陌生人可以向您解释它的可能性为零。
猜你喜欢
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多