Вставить данные в одну и ту же таблицу разными курсорами - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь выполнить процедуру с 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;

Вопрос здесь в том, как вставить выбранные данные из исходной таблицы в итоговую таблицу, если они имеют разные столбцы? Должны ли столбцы иметь одинаковое имя? Могу ли я вставить вкладыш только один раз?

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 24 июня 2018

«Я хочу сохранить все данные, полученные в другой таблице, но в виде одной записи»

Если вы хотите одну запись, вам нужна только одна вставка.

Внутренние циклы наследуют область видимости от своих внешних циклов, поэтому вы можете ссылаться на все три курсора из самого внутреннего цикла, например:

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. ОП должен использовать свое понимание своей модели данных, чтобы решить эту проблему.

...