Вставка данных в одну и ту же таблицу с разными курсорами

Я пытаюсь выполнить процедуру с тремя разными курсорами, получая данные из одной и той же таблицы.

Первый курсор получает только коллекции, второй курсор получает счета-фактуры, третий курсор получает кредит-ноты.

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;

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

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


person Carlos Valentin    schedule 24.06.2018    source источник
comment
В ваших операторах INSERT меньше полей, чем в таблице, в которую вы вставляете, и вы не включили список полей в INSERT, поэтому неясно, какие поля из курсоров должны переходить в различные поля на ИНФОФИНАЛ. Я подозреваю, что вы можете использовать один курсор и один INSERT, но поскольку я не могу понять, как должны совпадать поля, я не могу дать рекомендацию.   -  person Bob Jarvis - Reinstate Monica    schedule 24.06.2018
comment
Возможный дубликат Почему я получаю недостаточно значений при выполнении INSERT?   -  person krokodilko    schedule 24.06.2018


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

person APC    schedule 24.06.2018
comment
Я пытался это сделать, но он прислал мне следующие ошибки. PLS-00302: компонент 'IMPORTEHABERNOTA' должен быть объявлен Ошибка компиляции. PL/SQL: ORA-00984: столбец здесь не разрешен Компиляция не удалась. Мой вопрос в том, есть ли проблема, в которой столбцы имеют разные имена? - person Carlos Valentin; 24.06.2018
comment
Итак, какой столбец в таблице INFGENERAL соответствует столбцу INFOFINAL.IMPORTEHABERNOTA? Это ваша модель данных, вы должны ее знать, потому что нет никаких шансов, что какой-то случайный незнакомец в Интернете сможет вам ее объяснить. - person APC; 24.06.2018