【发布时间】: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