Jump to content
Sign in to follow this  
MVlisboa

Passar mais de um valor para as variáveis de uma procedure.

Recommended Posts

Como passar mais de um valor para as variáveis passada como parâmetro em uma procedure?



CREATE OR REPLACE PROCEDURE PS_CCORRENTE_DELETA(LANC IN NUMBER) IS
BEGIN
DELETE FROM MVCCORRENTE WHERE RECNUM IN (LANC);
END PS_CCORRENTE_DELETA;



Como informar mais de um valor para a variável LANC?

EX:



BEGIN
CCORRENTE_DELETA(1,2,3,4,5);
END;

Share this post


Link to post
Share on other sites

Acho que passando uma variável de type table se consegue isto.

Creio que seria preciso criar uma package para isto.

Uma solução mais simples pode ser

A procedure chamado insere em uma tabela rascunho as chaves s serem deletadas.

A procedure chamada delete com base nesta tabela e depois deleta ou trunca o que foi inserido.

Todavia , pesquise

http://stackoverflow.com/questions/28224884/passing-table-type-as-parameter-to-plsql-procedure

http://stackoverflow.com/questions/17067624/pl-sql-table-parameter

http://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dcitblfns.htm

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:208012348074

Share this post


Link to post
Share on other sites

Bom dia,

Você não pode abrir um cursor num bloco plsql para retornar os lançamentos e executar a sua procedure?

Deletando a cada retorno do cursor, um a um.

Share this post


Link to post
Share on other sites

Fazer tudo na mesma procedure , o problema não foi detalhado mas deve haver alguma razão para esta chamada.

Share this post


Link to post
Share on other sites

Motta, a chamada do PS é feito por um outro programa. Existe outro sistema do qual chamo a PS por ele e passo os parâmetros, que infelizmente só estou passando um, pois ainda não consegui resolver o problema. Ficaria muito grato se postasse algum exemplo simples usando como base o PS q informei. Estou procurando uma solução em tudo que é canto, mas não consigo montar nada. :/

Share this post


Link to post
Share on other sites

Bom , eu não faria esta exclusão em lista , é uma complicação desnecessária.

Uma chamada do tipo

create or replace procedure sp1 
begin
  for r in (select id from tabela2)
  loop
    sp2(r.id);
  end loop;
end;
create or replace procedure sp2 (pin in number)
begin
  delete from tabela where id = pid;
end;

Uma chamada recursiva como esta tendo índices não chega a ser ineficiente, a chamada pelo IN é.

Share this post


Link to post
Share on other sites

Motta, o problema é que o usuário precisa informar os valores para o parâmetro, que pode ser (1,2,4,7,10,1000,N) e no caso acima, não tem como fazer isso.

Share this post


Link to post
Share on other sites

Fiz uma solução mas vez , mas eu mesmo parei de usar pois era sempre ruim em termos de performance.

Nunca testei se este type poderia funcionar como parâmetro (creio que não) , para isto acho que uma package deva ser criada

http://www.devmedia.com.br/forum/parametro-para-sql-com-mais-de-um-valor/322419

------------------

Como seria a passagem destes parâmetros na aplicação ?

Grid , textbox etc ?

Share this post


Link to post
Share on other sites

Conseguir da seguinte forma: Criei um TYPE do tipo VARRAY, e passei uma variável do tipo do meu TYPE como parâmetro para a minha PROCEDURE.

CREATE OR REPLACE TYPE numberVarray IS VARRAY(50)OF NUMBER;
CREATE OR REPLACE PACKAGE BODY CCORRENTE IS
PROCEDURE PS_CCORRENTE_DELETA(V_LANC IN numberVarray) IS
BEGIN  
  FOR I IN 1..V_LANC.COUNT LOOP    
  DELETE FROM MVCCORRENTE WHERE RECNUM IN (V_LANC(I));  
  END LOOP;  
END PS_CCORRENTE_DELETA;
END CCORRENTE;
BEGIN
  CCORRENTE.PS_CCORRENTE_DELETA(V_LANC => numberVarray(1, 2, 50, 100));
END;

Share this post


Link to post
Share on other sites

Conseguir da seguinte forma: Criei um TYPE do tipo VARRAY, e passei uma variável do tipo do meu TYPE como parâmetro para a minha PROCEDURE.

CREATE OR REPLACE TYPE numberVarray IS VARRAY(50)OF NUMBER;
CREATE OR REPLACE PACKAGE BODY CCORRENTE IS

PROCEDURE PS_CCORRENTE_DELETA(V_LANC IN numberVarray) IS

BEGIN
  
  FOR I IN 1..V_LANC.COUNT LOOP
    
  DELETE FROM MVCCORRENTE WHERE RECNUM IN (V_LANC(I));
  
  END LOOP;
  
END PS_CCORRENTE_DELETA;

END CCORRENTE;
BEGIN
  CCORRENTE.PS_CCORRENTE_DELETA(V_LANC => numberVarray(1, 2, 50, 100));
END;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.