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
  

Mensagemem Ter, 31 Dez 2019 3:46 am

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

Código: Selecionar todos
create or replace  TYPE t_calxulo AS OBJECT
(p_ISS number,
p_COFINS number,
P_IR number,
P_IMPOSTO number,
P_TAXA number
);



Código: Selecionar todos
create or replace  TYPE to_calxulo AS OBJECT
(ISS number,
COFINS number,
IR number,
IMPOSTO number,
TAXA number
);


Código: Selecionar todos
create or replace  type calculo_tab                                                                     
as table of t_calxulo


----Procedure que fica os calculos ---

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

Mensagemem Ter, 31 Dez 2019 8:04 pm

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

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

Código: Selecionar todos
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;
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 Sex, 03 Jan 2020 12:19 pm

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.


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

Mensagemem Ter, 07 Jan 2020 7:48 pm

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 ?
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 Seg, 13 Jan 2020 5:06 pm

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
katiacd



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante