Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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;

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros 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. :/

Compartilhar este post


Link para o post
Compartilhar em outros 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 é.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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 ?

Compartilhar este post


Link para o post
Compartilhar em outros 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;

Compartilhar este post


Link para o post
Compartilhar em outros 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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.