Попытка вставить в таблицу во время цикла по SQL - PullRequest
0 голосов
/ 14 октября 2019

У меня есть представление, что мне нужно просмотреть все инвентарные идентификаторы из другой таблицы. Я продолжаю получать следующую ошибку: Отчет об ошибке -

ORA-06550: line 31, column 31:
PLS-00357: Table,View Or Sequence reference 'MISSINGINVENTORY' not allowed in this context
ORA-06550: line 31, column 2:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Это мой текущий код. Я не уверен, в чем проблема? Я довольно новичок в PL sql

 DECLARE
    CURSOR inventory_ids_c IS
      SELECT DISTINCT fzrfbth_status       status,
                      fzbfbth_inventory_id id
      FROM   fzbfbth@develop_sw,
             fzrfbth@develop_sw
      WHERE  fzbfbth_inventory_id = fzrfbth_inventory_id
      ORDER  BY fzrfbth_status,
                fzbfbth_inventory_id;
    inventory_ids_rec inventory_ids_c%ROWTYPE;
BEGIN
    OPEN inventory_ids_c;

    FETCH inventory_ids_c INTO inventory_ids_rec;

    LOOP
        EXIT WHEN inventory_ids_c%NOTFOUND;

        fzkfims.P_set_inventory_id@develop_sw(inventory_ids_rec.id);

        DECLARE
            CURSOR inventory_items IS
              SELECT *
              FROM   fzvfims@develop_sw;
        BEGIN
            OPEN inventory_items;

            LOOP
                FETCH inventory_items INTO Missinginventory(last_inventory_date,
                atype_title
                ,
                owner, orgn_code, orgn_title, locn_code, room, bldg, sort_room,
                ptag
                ,
                manufacturer, model, serial_num, description, custodian, po,
                acq_date,
                amount,
                ownership, schev_year, tag_type, inventory_id, condition,
                asset_type
                );

                EXIT WHEN inventory_items%NOTFOUND;
            END LOOP;

            CLOSE inventory_items;
        END;
    END LOOP;
END;  

1 Ответ

1 голос
/ 14 октября 2019

Похоже, что вы пытаетесь извлечь из курсора непосредственно в Missinginventory таблицу (если это таблица). Ну, это не сработает. Сначала выберите переменные курсора, затем вставьте эти переменные в таблицу.

Я не знаю, что это делает:

fzkfims.P_set_inventory_id@develop_sw(inventory_ids_rec.id);

;выглядит как вызов какой-то процедуры. Я предполагаю, что это устанавливает какую-то «среду», но я не знаю, как это отражается на написанном вами коде.

В любом случае: почему вы используете циклы курсора? Вы не можете напрямую вставить данные в таблицу? Это было бы быстрее и, надеюсь, проще.

Кроме того, если вы объявите что-то , сделайте это в том же месте, в начале этой процедуры PL / SQL. Если вы разбросали объявления по всему коду, поддерживать их сложно. Кроме того, посмотрите, являются ли петли курсора FOR опцией, поскольку они проще в использовании - Oracle многое для вас делает. Как? Хотя вам все еще нужно написать оператор курсора SELECT, вам не нужно объявлять переменные курсора, открывать курсор, выбирать, заботиться о выходе из цикла, закрывать курсор. Я постараюсь переписать ваш код, посмотрю (как видите, никакого раздела declare!).

 begin
    for cur_1 in (select distinct fzrfbth_status       status,
                                  fzbfbth_inventory_id id
                  from   fzbfbth@develop_sw
                         join fzrfbth@develop_sw
                           on fzbfbth_inventory_id = fzrfbth_inventory_id
                  order  by fzrfbth_status,
                            fzbfbth_inventory_id
                 ) 
    loop
        fzkfims.p_set_inventory_id@develop_sw(cur_1.id);

        for cur_2 in (select *
                      from   fzvfims@develop_sw
                     ) 
        loop
            -- I shortened it to just a few columns
            insert into missinginventory
                        (last_inventory_date,
                         atype_title,
                         asset_type)
            values      (cur_2.last_inventory_date,
                         cur_2.atype_title,
                         cur_2.asset_type);
        end loop;
    end loop;
end;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...