MVlisboa 0 Denunciar post Postado Agosto 23, 2016 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
geovani.cristofolini 0 Denunciar post Postado Agosto 23, 2016 Bom dia, Dá uma olhada neste tópico.http://glufke.net/oracle/viewtopic.php?f=3&t=10123 Compartilhar este post Link para o post Compartilhar em outros sites
MVlisboa 0 Denunciar post Postado Agosto 23, 2016 Em alguns casos seriam mais de 400 valores. Então não seria interessante criar uma variável para cada um. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 23, 2016 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
spernega 4 Denunciar post Postado Agosto 23, 2016 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
Motta 645 Denunciar post Postado Agosto 23, 2016 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
MVlisboa 0 Denunciar post Postado Agosto 23, 2016 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
Motta 645 Denunciar post Postado Agosto 23, 2016 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
MVlisboa 0 Denunciar post Postado Agosto 24, 2016 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
Motta 645 Denunciar post Postado Agosto 24, 2016 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
geovani.cristofolini 0 Denunciar post Postado Agosto 25, 2016 Boa noite, Assim não irá funcionar? CREATE OR REPLACE PROCEDURE PS_CCORRENTE_DELETA(LANC IN NUMBER) IS BEGIN DELETE FROM MVCCORRENTE WHERE '%,'||LANC||',%' like '%,'||RECNUM||',%' END PS_CCORRENTE_DELETA; Compartilhar este post Link para o post Compartilhar em outros sites
MVlisboa 0 Denunciar post Postado Agosto 31, 2016 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
MVlisboa 0 Denunciar post Postado Agosto 31, 2016 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