Retornar os calculos automaticos atraves de procedures

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

Prezados boa noite!

Nos postes anteriores, acho que não consegui expressar o que preciso desenvolver. Vou explicar de uma forma simples, resumindo o que estou desenvolvendo, pois de repente alguém possa me ajudar na minha dúvida.

Atualmente estou desenvolvendo em pl-sql, algumas procedures, e todas com entrada e saidas com Types, e não conheço bem.

A PROCEDURE proc_motor e funções , esta no exemplo abaixo,

A PROCEDURE proc_motor é uma proc de cálculos.

Vou desenvolver uma segunda procedure, chamando a proc_motor (cálculos), e quero saber como faço para fazer a chamada desta proc_motor, pois a mesma terá que fazer cálculos automáticos. Tipo, usuário digita e a procedure calcula, e depois inserir estes cálculos em uma tabela. . Alguém pode me dar uma luz?

Exemplo das funcionalidades abaixo: Funções, types e procedures passo a passo, como fiz.



--IR

Selecionar tudo

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

Selecionar tudo

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

Selecionar tudo

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;

--- Criei estas types ---

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

Selecionar tudo

create or replace  TYPE to_calxulo AS OBJECT 
(ISS number,
COFINS number,
IR number,
IMPOSTO number,
TAXA number 
);

Selecionar tudo

create or replace  type calculo_tab                                                                     
as table of t_calxulo
----Procedure que fica os calculos ---

Selecionar tudo

create or replace  PROCEDURE proc_motor ( 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

Kátia
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

Imagino que você precisa alterar sua procedure pra ser IN OUT, e não apenas IN.

Algo assim:

Selecionar tudo

create or replace  PROCEDURE proc_motor ( calculo_tab  in OUT t_calxulo )
Dessa forma, você pode passar uma variável ali que a procedure vai mandar de volta pra você esses valores.
Era isso ?

Selecionar tudo

DECLARE
  vt_var  t_calxulo;
BEGIN
  proc_motor( vt_tar );
  
  dbms_output.put_line (vt_tar.ISS);
  dbms_output.put_line (vt_tar.COFINS);
--etc
END;
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

Bom dia, e obrigada pelo retorno.

Como havia comentado, esta proc_motor, fica meus calculos, onde passo os parametro manualmente, faço print dos testes (dbms_output.put_line) beleza, esta funcionando.
Faço assim para testar. Exemplo abaixo.

A ideia é trazer estes dados calculados automaticamente, quando o usuário digitar. Esta proc_motor será chamada dentro de uma outra procedure, por isso tenho
duvidas como retornar estes dados digitados.

Selecionar tudo

DECLARE
    vt_var t_calxulo;;
   
BEGIN


SELECT t_calxulo( 52,  -- parametro            
                  10,  -- parametro                    
                  3,   -- parametro     
                  4,   -- parametro     
                  6    -- parametro               
) BULK COLLECT
INTO vt_var       
FROM DUAL;

PROC_MOTOR(vt_var);

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

Acho que está havendo alguma confusão aqui.
Explique o objetivo de tudo isso.

Pelo que eu entendi, você quer
1. criar um TYPE contendo vários campos.
2. Criar uma variável desse TYPE.
3. Popular todos os campos desse TYPE dentro de uma procedure
4. retornar a variável com os valores.

Pra isso, não precisa criar um "AS TABLE OF nnnnn".
Basta ter um TYPE (ou até mesmo usar variáveis "soltas").

Outra coisa que não entendi é o BULK COLLECT from dual.
O Bulk serve pra colocar um bocado de linhas numa variáveis, e depois processar isso em "lote".

Tem algum motivo pra você estar usando TYPE, variáveis TABLE, etc ?
katiacd
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 09 Mai 2016 3:07 pm
Cristine

Analista Pleno

Boa tarde dr_gori!


Usei o BULK COLLECT from dual, apenas para mostrar quando faço o teste em um bloco, passando parâmetros.

Estou utilizando type, por ser uma imensa carga de informações (dados).

Só preciso agora pegar estes retornos destes types, e deixar automáticos, quando o usuário digitar os campos,passando estes parâmetros,
pois a procedure fará os cálculos seria isso.


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

    Usuários navegando neste fórum: Majestic-12 [Bot] e 3 visitantes