Execução da procedure retornando sem dados!

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!

O que preciso é simples. O dr_gori, me ajudou muito ate agora.

A procedure proc_calculos ) abaixo,está funcionando perfeito! Agora,quero trazer os resultados desta procedure ( proc_calculos ), dentro de outra procedure que estou criando. Criei um type de entrada ( calculo_tab ), onde passo os parâmetros, e quero trazer
os retornos dos cálculos, e gravar em uma tabela. ´É somente isso. Estou tentando trazer os dados, mas vem vazio. alguém pode me ajudar?

segue o exemplo do retorno vazio:
A função retorna TOTAL ISS: 7 e TOTAL IR: 5, esta correto.

Mas quando vou chamar dentro de outra procedure, passando parâmetros, retorna TOTAL ISS: e TOTAL IR: vazios.....

TOTAL ISS: 7
TOTAL IR: 5
TOTAL ISS:
TOTAL IR:


-Procedure que fica os calculos ---

CÓDIGO: SELECIONAR TODOS

Selecionar tudo

create or replace  PROCEDURE proc_calculos ( calculo_tab  in t_calxulo )

AS
                                         
  --Retorno (Saida Funções Calculadas)                                       
  v_num1  NUMBER := 0;     
  v_num2  NUMBER := 0;
  v_num3  NUMBER := 0; 


  -- type que receberá o retorno (Saida Funções Calculadas)
  type tret_motor is record ( v_num1  number,
                              v_num2  number,
                              v_num3  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_num1 := fn_ISS( calculo_tab.p_iss , calculo_tab.p_COFINS );

    --FUNCTION 2
    v_num2 := fn_ir( calculo_tab.P_IR, calculo_tab.P_IMPOSTO);

    --FUNCTION 3
     v_num3 := fn_taxa( calculo_tab.P_TAXA, calculo_tab.P_IMPOSTO, calculo_tab.p_ISS );
     
    --Agora alimentamos o v_row a ser retornado
    vret_motor.v_num1 := v_num1;
    vret_motor.v_num2 := v_num2;
    vret_motor.v_num3 := v_num3;
    --
    return vret_motor;
  end fun_ret_motor; 
begin
  -- Chamada da função
  vretorno := fun_ret_motor;
  -- Print dos dadosfun_ret_motor;
  dbms_output.put_line('FUNCTION 1: '||vretorno.v_num1);
  dbms_output.put_line('FUNCTION 2: '||vretorno.v_num2);
  dbms_output.put_line('FUNCTION 3: '||vretorno.v_num3);

end;

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

Eu criei aqui as suas procedures, e types.
Veja como eu consegui executar a sua procedure passando os parametros:

Selecionar tudo

SQL> set serveroutput on
SQL> declare
  2    type tipo is table of t_calxulo index by binary_integer;
  3    aa tipo;
  4  begin
  5  
  6    aa(1) := t_calxulo( 10, 20, 30, 40, 50);
  7    aa(2) := t_calxulo(  1,  2,  3,  4,  5);
  8  
  9    proc_calculos (aa(1) );
 10    dbms_output.put_line(' --------------------- ');
 11    proc_calculos (aa(2) );
 12  end;
 13  /

Resultado: 30
Resultado: 70
Resultado: 2010
FUNCTION 1: 30
FUNCTION 2: 70
FUNCTION 3: 2010
 --------------------- 
Resultado: 3
Resultado: 7
Resultado: 21
FUNCTION 1: 3
FUNCTION 2: 7
FUNCTION 3: 21

PL/SQL procedure successfully completed


SQL> 

Pra quem quiser criar tudo, esse é o código que cria as coisas:

Selecionar tudo

create or replace  TYPE t_calxulo AS OBJECT
(p_ISS number,
p_COFINS number,
P_IR number,
P_IMPOSTO number,
P_TAXA number
);



create or replace function fn_ir (p_IR number default 0,
                                                 p_IMPOSTO number default 0 ) return number is
    v_ir number;
    begin
      v_ir :=  p_IR + p_IMPOSTO;
      dbms_output.put_line ( 'Resultado: '||v_ir);
      return v_ir;
    end;
    
    
create or replace  function fn_iss (p_ISS number default 0,
                                    p_COFINS number default 0 ) return number is
    v_iss number;
    begin
      v_iss :=  p_ISS +  p_COFINS;
      dbms_output.put_line ( 'Resultado: '||v_iss );
      return v_iss;
    end;   
    


create or replace  function fn_taxa (p_TAXA number default 0,
                                     p_IMPOSTO number default 0,
                                     p_ISS number default 0) return number is
    v_taxa number;
    begin
      v_taxa :=  p_TAXA * p_IMPOSTO + p_ISS;
      dbms_output.put_line ( 'Resultado: '||v_taxa);
      return v_taxa;
    end;




create or replace  PROCEDURE proc_calculos ( calculo_tab  in t_calxulo )

AS
                                 
  --Retorno (Saida Funções Calculadas)                                       
  v_num1  NUMBER := 0;     
  v_num2  NUMBER := 0;
  v_num3  NUMBER := 0;


  -- type que receberá o retorno (Saida Funções Calculadas)
  type tret_motor is record ( v_num1  number,
                              v_num2  number,
                              v_num3  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_num1 := fn_ISS( calculo_tab.p_iss , calculo_tab.p_COFINS );

    --FUNCTION 2
    v_num2 := fn_ir( calculo_tab.P_IR, calculo_tab.P_IMPOSTO);

    --FUNCTION 3
     v_num3 := fn_taxa( calculo_tab.P_TAXA, calculo_tab.P_IMPOSTO, calculo_tab.p_ISS );
     
    --Agora alimentamos o v_row a ser retornado
    vret_motor.v_num1 := v_num1;
    vret_motor.v_num2 := v_num2;
    vret_motor.v_num3 := v_num3;
    --
    return vret_motor;
  end fun_ret_motor;
  
  
  
begin
  -- Chamada da função
  vretorno := fun_ret_motor;
  -- Print dos dadosfun_ret_motor;
  dbms_output.put_line('FUNCTION 1: '||vretorno.v_num1);
  dbms_output.put_line('FUNCTION 2: '||vretorno.v_num2);
  dbms_output.put_line('FUNCTION 3: '||vretorno.v_num3);

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

Katiacd: uma dica: sempre continua um tópico já aberto, não precisa criar um tópico novo cada vez.
E pra colocar os SQL de forma organizada, faz assim:

[code]SELECT * FROM XXXX[/code]

Usa essas tags [code] e pra fechar [/code]
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

dr_gori, muito obrigada!

Minha duvida agora que ainda não esta dando certo. Veja abaixo: Quero pegar esses resultados (FUNCTION 1,FUNCTION 2,FUNCTION 3) dentro de outra procedure que estou criando e inserir em uma tabela. Esta vindo sem dados.


FUNCTION 1: 30
FUNCTION 2: 70
FUNCTION 3: 2010
---------------------

FUNCTION 1: 3
FUNCTION 2: 7
FUNCTION 3: 21

Como posso resolver isto?
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

Fiz o seguinte:

Criei o type TRET_MOTOR a nível de banco. (E não de procedure).

Selecionar tudo

CREATE OR REPLACE TYPE tret_motor is object ( v_num1  number,
                              v_num2  number,
                              v_num3  number)
Botei no lixo a PROC_CALCULOS.

Alterei a FUN_RET_MOTOR colocando 2 parâmetros:
* Um type para os valores dos impostos e taxas
* Um type para o RETORNO do cálculo. (v1, v2, v3).

Ficando dessa forma:

Selecionar tudo

CREATE OR REPLACE PROCEDURE fun_ret_motor
( calculo_tab IN      t_calxulo
, vretorno    IN OUT  tret_motor )
IS                             
begin

  --FUNCTION 1
  vretorno.v_num1 := fn_ISS( calculo_tab.p_iss , calculo_tab.p_COFINS );

  --FUNCTION 2
  vretorno.v_num2 := fn_ir( calculo_tab.P_IR, calculo_tab.P_IMPOSTO);

  --FUNCTION 3
  vretorno.v_num3 := fn_taxa( calculo_tab.P_TAXA, calculo_tab.P_IMPOSTO, calculo_tab.p_ISS );

end fun_ret_motor;
Aí, pra testar, eu fiz assim:

Selecionar tudo

declare
  type tipo1 is table of t_calxulo  index by binary_integer;
  type tipo2 is table of tret_motor index by binary_integer;
  aa tipo1;
  bb tipo2;
begin
  aa(1) := t_calxulo( 10, 20, 30, 40, 50);
  bb(1) := tret_motor( 0,0,0);
  fun_ret_motor (aa(1), bb(1) );
  dbms_output.put_line(bb(1).v_num1);
  dbms_output.put_line(bb(1).v_num2);
  dbms_output.put_line(bb(1).v_num3);
  
  dbms_output.put_line('---TESTE 2------------------ ');
 
  aa(2) := t_calxulo( 1, 2, 3, 4, 5);
  bb(2) := tret_motor( 0,0,0);
  fun_ret_motor (aa(2), bb(2) );
  dbms_output.put_line(bb(2).v_num1);
  dbms_output.put_line(bb(2).v_num2);
  dbms_output.put_line(bb(2).v_num3);
end;
E isso gerou a seguinte saída:

Selecionar tudo

Resultado: 30
Resultado: 70
Resultado: 2010
30
70
2010
---TESTE 2------------------ 
Resultado: 3
Resultado: 7
Resultado: 21
3
7
21

PL/SQL procedure successfully completed


SQL> 
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

Showwww dr_gori!

Muito obrigada mesmo!

Vou seguir aqui o exemplo aqui.
Responder
  • Informação
  • Quem está online

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