Como pegar estes valores de retorno da procedure?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

Boa noite!

Como faço para pegar o retorno destes valores desta procedure e inserir em uma tabela. Não conheço muito type,
e não estou conseguindo pegar estes valores retornados.
Veja o exemplo abaixo:



--- Procedure que fica os calculos ---

Selecionar tudo

create or replace NONEDITIONABLE PROCEDURE proc_motor ( t_calculo  in out to_calculo) AS
                                     
  --Retorno (Saida Funções Calculadas)                                        
  v_tot_iss  NUMBER := 0;     
  v_tot_ir   NUMBER := 0;
 
  -- type que receberá o retorno (Saida Funções Calculadas)
  type tret_motor is record ( v_tot_iss  number,
                              v_tot_ir  number);

  vretorno tret_motor;                               

  -- função que retorna os valores (Saida Funções Calculadas)
  function fun_ret_motor
  return tret_motor
  is
     vret_motor tret_motor;
  
  begin
    
    --Retorno das funções-----------
    --FUNCTION 1
    v_tot_iss := fn_ISS( t_calculo.ISS , t_calculo.COFINS );

    --FUNCTION 2
    v_tot_ir := fn_ir( t_calculo.IR, t_calculo.IMPOSTO);
   
     
    --Agora alimentamos o v_row a ser retornado
    vret_motor.v_tot_iss := v_tot_iss;
    vret_motor.v_tot_ir  := v_tot_ir;
    --
   
    return vret_motor;
     -- END LOOP;
  end fun_ret_motor;  
 
begin
  -- Chamada da função
  vretorno := fun_ret_motor;
  -- Print dos dadosfun_ret_motor;
  dbms_output.put_line('TOTAL ISS: '||vretorno.v_tot_iss);
  dbms_output.put_line('TOTAL IR:  '||vretorno.v_tot_ir);

end;
---Execução do bloco ---

Selecionar tudo

DECLARE
  T_CALCULO TO_CALCULO;
BEGIN

  PROC_MOTOR(T_CALCULO);

  ---Insere o resultado da proc na tabela calculo---
  INSERT INTO calculo (total_iss,
                                  total_ir)
   VALUES(4,
              4);
END;

--Resultado do bloco--

Selecionar tudo

TOTAL ISS: 4
TOTAL IR: 4
ISS 

obrigada
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Parece que em nenhum momento você ta salvando os dados desejados em t_calculo (dentro da package).
Antes de terminar a package, você precisa salvar os dados na variável OUT.

Algo assim:

Selecionar tudo

create or replace NONEDITIONABLE PROCEDURE proc_motor ( t_calculo  in out to_calculo) AS
.
.
.
.      
begin
  -- Chamada da função
  vretorno := fun_ret_motor;
  -- Print dos dadosfun_ret_motor;
  dbms_output.put_line('TOTAL ISS: '||vretorno.v_tot_iss);
  dbms_output.put_line('TOTAL IR:  '||vretorno.v_tot_ir);

  t_calculo.v_tot_iss := vretorno.v_tot_iss;
  t_calculo.v_tot_ir  := vretorno.v_tot_ir;

  -- OU, você pode tentar assim:    t_calculo := vretorno;

end;

Daí, na execução:

Selecionar tudo

DECLARE
  VCALC  TO_CALCULO;
BEGIN

  PROC_MOTOR(VCALC);

  ---Insere o resultado da proc na tabela calculo---
  INSERT INTO calculo (total_iss,
                                  total_ir)
   VALUES(vcalc.total_iss,
              vcalc.total_ir);
END;
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

Boa noite dr_guri!

Agora entendi....Muito obrigada pela ajuda. Você me ajudou muito mesmo.

Vou desta forma. :-o
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

Boa noite dr_gori.

Fiz da forma que me instruiu, mas não deu certo. não retornou nada.

Selecionar tudo

create or replace PROCEDURE proc_motor ( t_calculo  in out to_calculo) AS
     
begin
  -- Chamada da função
  vretorno := fun_ret_motor;
  -- Print dos dadosfun_ret_motor;
  dbms_output.put_line('TOTAL ISS: '||vretorno.v_tot_iss);
  dbms_output.put_line('TOTAL IR:  '||vretorno.v_tot_ir);

  t_calculo.v_tot_iss := vretorno.v_tot_iss;
  t_calculo.v_tot_ir  := vretorno.v_tot_ir;

Não retorna, porque os campos ( v_tot_iss e v_tot_ir) são saidas, resultantes da entradas
de parametro das funções , conforme passado abaixo o exemplo--

Selecionar tudo

 --FUNCTION 1
    v_tot_iss := fn_ISS( t_calculo.ISS , t_calculo.COFINS );

 --FUNCTION 2
   v_tot_ir := fn_ir( t_calculo.IR, t_calculo.IMPOSTO);



Somente uma duvida: Na procedure, tenho o T_calculo como entrada in out.
Não sei se notou, mas na minha procedure, o type saida, é tratado dentro da propria procedure.

Você tem alguma ideia como posso resolver isso?

obrigada
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes