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
  

Mensagemem Dom, 05 Jan 2020 11:10 pm

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 ---

Código: Selecionar todos
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 ---

Código: Selecionar todos
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--

Código: Selecionar todos
TOTAL ISS: 4
TOTAL IR: 4
ISS



obrigada
katiacd

Mensagemem Seg, 06 Jan 2020 7:17 pm

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:
Código: Selecionar todos
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:

Código: Selecionar todos
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;
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Ter, 07 Jan 2020 1:03 am

Boa noite dr_guri!

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

Vou desta forma. :-o
katiacd

Mensagemem Ter, 07 Jan 2020 6:45 pm

Boa noite dr_gori.

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

Código: Selecionar todos
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--

Código: Selecionar todos
--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
katiacd



Voltar para PL/SQL

Quem está online

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