Chiappa, reaproveitei a massa de dados que o Emerson Gaudencio criou, mas
adaptei a procedure dele... bom, segue novamente,
acredito que agora ficará mais fácil de explicar.

create table itens_da_nota (
item_nota_id number(8),
produto_id number(8),
quantidade number(8),
retorno number(8)
);

create table expedicao (
exp_id     number(8),
produto_id     number(8),
quantidade number(8),
itens_nota varchar2(1000)
);

create unique index EXP_UNICO on EXPEDICAO (EXP_ID, PRODUTO_ID, QUANTIDADE);

-- Create sequence
create sequence EXPEDICAOID
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
nocache;

--  inserts

insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
values (1, 10, 100, null);
insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
values (2, 20, 120, null);
insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
values (3, 10, 150, null);
insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
values (4, 20, 300, null);
commit;

-- trigger pra preencher o ID da expedição:
-------------------------------------------------------------
create or replace trigger t_i_expedicao
  before insert on expedicao
  for each row
declare
  id_expedicao number;
  -- local variables here
begin
  if :new.exp_id is null then
    SELECT EXPEDICAOID.NEXTVAL INTO id_expedicao FROM DUAL;
    :new.exp_id := id_expedicao;
  end if;
end t_i_expedicao;

-------------------------------------------------------------------------

create or replace procedure p_agrupa as
  total_itens  NUMBER;
  produto_id   NUMBER;
  id_expedicao NUMBER;
  --  CURSOR c_itens_nota IS
  --    SELECT produto_id, quantidade, ROWID FROM itens_da_nota;
BEGIN

  insert into expedicao
    (produto_id, quantidade, oel_id)
    select i.produto_id,
           sum(i.quantidade),
           listagg(i.item_nota_id, ',') WITHIN GROUP(ORDER BY
i.item_nota_id)
      from itens_da_nota i
     group by i.produto_id;

end;


begin
  p_agrupa;
end;


Reparem que usei o LISTAGG pra preencher o ultimo campo da EXPEDICAO.
Eu não sei se realmente vou precisar desse campo, mas criei pra ajudar aqui
na demonstração.

SQL> select * from itens_da_nota;

ITEM_NOTA_ID PRODUTO_ID QUANTIDADE    RETORNO
------------ ---------- ---------- ----------
           1         10        100
           2         20        120
           3         10        150
           4         20        300


SQL> select * from expedicao;

    EXP_ID PRODUTO_ID QUANTIDADE  OEL_ID
---------- ---------- ----------
         8         10        250       1,3

         9         20        420       2,4

Agora o que falta é:

Quero fazer um UPDATE da ITENS_DA_NOTA, no campo RETORNO, fazendo receber o
EXP_ID
relacionando conforme o campo OEL_ID. Ficaria assim:

ITEM_NOTA_ID PRODUTO_ID QUANTIDADE    RETORNO
------------ ---------- ---------- ----------
           1         10        100              8
           2         20        120              9
           3         10        150              8
           4         20        300              9







Em 31 de maio de 2014 14:32, Milton Bastos Henriquis Jr. <
miltonbas...@gmail.com> escreveu:

> Emerson, não funcionou:
>
> SQL> select * from itens_da_nota;
>
> ITEM_NOTA_ID PRODUTO_ID QUANTIDADE    RETORNO
> ------------ ---------- ---------- ----------
>            1         10        100          1
>            2         20        120          1
>            3         10        150          1
>            4         20        300          1
>
> SQL> select * from expedicao;
>
>     EXP_ID PRODUTO_ID QUANTIDADE
> ---------- ---------- ----------
>          1         10        250
>          1         20        420
>
> SQL>
>
>
>
>
> Em 30 de maio de 2014 19:51, Milton Bastos Henriquis Jr. <
> miltonbas...@gmail.com> escreveu:
>
> Obrigado Emerson!
>>
>> vou tentar adaptar essa solução aqui pra base e testar na segunda-feira,
>> vamos ver!
>>
>> Valeu mesmo!
>>
>>
>> Em 30 de maio de 2014 19:20, Emerson dos Santos Gaudêncio
>> emerson.fen...@gmail.com [oracle_br] <oracle_br@yahoogrupos.com.br>
>> escreveu:
>>
>>
>>>
>>> Miltão,
>>>
>>> Quebrei um pouco a cachola aqui e pensei numa forma de conseguir
>>> resolver isso. Segue meu protótipo espero ajudar:
>>>
>>> create table itens_da_nota (
>>> item_nota_id number(8),
>>> produto_id number(8),
>>> quantidade number(8),
>>> retorno number(8)
>>> );
>>>
>>> create table expedicao (
>>> exp_id     number(8),
>>> produto_id     number(8),
>>> quantidade number(8)
>>> );
>>>
>>> create unique index EXP_UNICO on EXPEDICAO (EXP_ID, PRODUTO_ID,
>>> QUANTIDADE);
>>>
>>> -- Create sequence
>>> create sequence EXPEDICAOID
>>> minvalue 1
>>> maxvalue 9999999999999999999999999999
>>> start with 1
>>> increment by 1
>>> cache 20;
>>>
>>> --  inserts
>>>
>>> insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
>>> values (1, 10, 100, null);
>>> insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
>>> values (2, 20, 120, null);
>>> insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
>>> values (3, 10, 150, null);
>>> insert into itens_da_nota (ITEM_NOTA_ID, PRODUTO_ID, QUANTIDADE, RETORNO)
>>> values (4, 20, 300, null);
>>> commit;
>>>
>>> -- bloco anonimo de atualização dos registros
>>>
>>> DECLARE
>>>    total_itens  NUMBER;
>>>    produto_id  NUMBER;
>>>    id_expedicao NUMBER;
>>>    CURSOR c_itens_nota IS
>>>       SELECT produto_id, quantidade, ROWID
>>>       FROM   itens_da_nota
>>>      ;
>>> BEGIN
>>>    SELECT EXPEDICAOID.NEXTVAL INTO id_expedicao FROM   DUAL;
>>>    FOR rc_itens_nota IN c_itens_nota
>>>    LOOP
>>>       BEGIN
>>>       SELECT SUM(quantidade), produto_id
>>>       INTO   total_itens, produto_id
>>>       FROM   itens_da_nota
>>>       WHERE  produto_id = rc_itens_nota.produto_id
>>>       GROUP  BY produto_id;
>>>       INSERT INTO EXPEDICAO
>>>       VALUES
>>>          (id_expedicao,
>>>           produto_id,
>>>           total_itens);
>>>       UPDATE itens_da_nota t
>>>       SET    t.retorno = id_expedicao
>>>       WHERE  ROWID = rc_itens_nota.rowid;
>>>       EXCEPTION WHEN OTHERS THEN
>>>         UPDATE itens_da_nota t
>>>       SET    t.retorno = id_expedicao
>>>       WHERE  ROWID = rc_itens_nota.rowid;
>>>       END;
>>>    END LOOP;
>>>    COMMIT;
>>> END;
>>>
>>>
>>>
>>>
>>>
>>> Em 30 de maio de 2014 16:20, 'Milton Bastos Henriquis Jr.'
>>> miltonbas...@gmail.com [oracle_br] <oracle_br@yahoogrupos.com.br>
>>> escreveu:
>>>
>>>
>>>>
>>>> Legal Chiappa, obrigado!
>>>>
>>>> Essa questão de retornar múltiplas linhas vc matou a charada, eu não
>>>> conhecia esse esquema.
>>>>
>>>> Agora tenho outro problema... além de retornar esse valor eu precisaria
>>>> gravá-lo nos registros correspondentes da ORIGEM (ou seja, do SELECT que
>>>> originou os valores do insert).
>>>> Não consigo imaginar uma solução pra isso - associar esses novos
>>>> registros inseridos com os registros da origem desses dados.
>>>> A dificuldade é justamente por causa do agrupamento.
>>>>
>>>> Exemplo (espero que funcione a formatação):
>>>>
>>>>
>>>>    item_nota_id    produto_id quantidade retorno  1 10 100  2 20 120  3
>>>> 10 150  4 20 300
>>>> Faço o insert na EXPEDIÇAO:   expedição   exp_id produto_id quantidade
>>>> 51 10 250  52 20 420     Depois atualizo na tabela origem o campo
>>>> retorno:
>>>>
>>>>    item_nota_id    produto_id quantidade retorno  1 10 100 51  2 20 120
>>>> 52  3 10 150 51  4 20 300 52
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Em 30 de maio de 2014 16:52, jlchia...@yahoo.com.br [oracle_br] <
>>>> oracle_br@yahoogrupos.com.br> escreveu:
>>>>
>>>>
>>>>>
>>>>> Miltão, realmente ficou meio confuso, mas ao menos até onde entendi a
>>>>> questão parece ser que vc precisa de uma RETURNING clause retornando
>>>>> múltiplas linhas : a sintaxe para isso é RETURNING BULK COLLECT....
>>>>> http://www.java2s.com/Tutorial/Oracle/0440__PL-SQL-Statements/UsingtheRETURNINGBULKCOLLECTclausetoSELECTdirectlyintoaPLSQLarray.htm
>>>>> tem um exemplo para um UPDATE retornando múltiplos valores em múltiplas
>>>>> linhas, imagino que para INSERT deve ser similar.... E logicamente :
>>>>>
>>>>> a) na hora de processar o array PL/SQL com os valores vc usará FORALL
>>>>> e os construtos de array do PL/SQL
>>>>>
>>>>> e
>>>>>
>>>>> b) sempre que falamos em arrays, vc TEM que ter em mente as limitações
>>>>> de memória do PL/SQL : tenha certeza que o retorno vai ser no máximo na
>>>>> casa das CENTENAS, não muito mais que isso, sob pena de esgotar PGA e/ou 
>>>>> os
>>>>> limites de variáveis do PL/SQL, okdoc ?
>>>>>
>>>>>  []s
>>>>>
>>>>>    Chiappa
>>>>>
>>>>
>>>>
>>>  
>>>
>>
>>
>
  • [oracle... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
    • Re... Emerson dos Santos Gaudêncio emerson.fen...@gmail.com [oracle_br]
      • ... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
        • ... jlchia...@yahoo.com.br [oracle_br]
          • ... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
            • ... jlchia...@yahoo.com.br [oracle_br]
            • ... Emerson dos Santos Gaudêncio emerson.fen...@gmail.com [oracle_br]
              • ... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
                • ... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
                • ... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
                • ... flavio_brune...@yahoo.com [oracle_br]
                • ... 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
                • ... jlchia...@yahoo.com.br [oracle_br]

Responder a