PLSQL: Как проходить построчно через курсор, копировать значения в таблицу и в том же цикле сохранять эти значения в переменные? - PullRequest
0 голосов
/ 02 декабря 2018

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

PL/SQL code

Предполагая, что все значения / таблицы были созданы правильно, и что у меня внизу есть команды "end loop" и "close c_ProdutosEncomenda", чего здесь не хватает?

Выдает следующую ошибку:

Errors

Код, о котором идет речь:

    create or replace Procedure proc_nota_encomenda(p_id_notaEncomenda in NotaEncomenda.cod_notaEncomenda%TYPE)

   IS

   cursor c_ProdutosEncomenda IS
   Select Distinct f.cod_armazem, nep.cod_produto
    from notaencomenda ne join
    funcionario f on ne.cod_funcionario=f.cod_funcionario
    join NotaEncomenda_Produto nep on ne.cod_notaencomenda=nep.cod_notaencomenda;   

   ex_cod_notaEcomenda_n_existe EXCEPTION;
   codigo_encomenda number;    
   ProdutosEncomenda c_ProdutosEncomenda%ROWTYPE;
   stockArmazem number;
   stockMinimo number;
   stockPedido number;    
   armazem number;
   produto number;

   Begin

   Select cod_notaencomenda into codigo_encomenda from NotaEncomenda where cod_notaEncomenda=p_id_notaEncomenda;

   If (codigo_encomenda!=p_id_notaEncomenda) THEN

   raise ex_cod_notaEcomenda_n_existe;

   end if;   

   Open c_ProdutosEncomenda;

    Loop

       Fetch c_ProdutosEncomenda INTO ProdutosEncomenda;

       Exit when c_ProdutosEncomenda%NotFound;        

       Select cod_armazem from ProdutoEncomenda into armazem;
       Select cod_produto from ProdutosEncomenda into produto;

       stockArmazem:= FUNC_STOCK_ARTIGO_ARMAZEM(produto,armazem);        

       Select stock_minimo INTO stockMinimo FROM Stock where Produto_cod_produto=ProdutosEncomenda.cod_produto

       AND Armazem_cod_Armazem=ProdutosEncomenda.cod_armazem;        

       Select quantidade INTO stockPedido FROM NotaEncomenda_Produto WHERE cod_produto=ProdutosEncomenda.cod_produto

       AND cod_notaEncomenda=p_id_notaEncomenda;            

       If stockArmazem-stockPedido<stockMinimo THEN                

       Insert into ProdutosEmFalta Values (ProdutosEncomenda.cod_produto,p_id_notaEncomenda,stockPedido);           

       Else

               Insert into GuiaSaida (cod_notaEncomenda) Values (ProdutosEncomenda.cod_produto);
               Insert into ZonaArmazem_Produto_GuiaSaida (cod_produto,id_guia,quantidadeRetirada) 
               Values (ProdutosEncomenda.cod_produto,ProdutosEncomenda.cod_armazem,stockPedido);

           end if;

       end loop;
    Close c_ProdutosEncomenda;

   Exception

   when ex_cod_notaEcomenda_n_existe then

       raise_application_error(-20001,'Nota de encomenda inexistente');    end;

1 Ответ

0 голосов
/ 02 декабря 2018

Что такое ProdutosEncomenda?Я могу только догадываться, что это переменная некоторого типа записи.Если это так, то вы не должны выбирать из этого.Вместо этого вы можете просто получить конкретные значения полей, например:

armazem := ProdutosEncomenda.cod_armazem;
produto := ProdutosEncomenda.cod_produto;

Но было бы действительно проще, если бы вы показали весь код (а не как изображение, как предлагает a_horse_with_no_name).Хорошо, что вы приложили ошибки, но я даже не знаю, на какие строки они ссылаются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...