我正在尝试使用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;
这里的问题是,当列中的列不同时,如何将所选数据从源表插入到最终表中?这些列应该具有相同的名称吗?我只能插入一次插入内容吗?
请帮助。
答案 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需要利用他们对数据模型的理解来解决这个问题。