"Collection" de Bind´s variable
Boa tarde.
Alguém sabe uma maneira de passar uma "lista/collection" de bind variable ao trabalhar com sql dinâmico utilizando cursor?
Exemplificando meu problema, tenho a procedure abaixo, onde há comentários para exemplificar e questionar melhor o problema
create or replace procedure pr_teste(
pAtivo number := 1,
pCampo2 number,
pCampo3 varchar2,
pCampo4 varchar2,
pCursor in out SYS_REFCURSOR,
) is
vQuery varchar2(1000);
vWhere varchar2(1000) := '';
begin
vQuery := 'select * from clientes where ativo = :ativo ';
if pCampo2 > 0 then
vWhere := vWhere || ' and campo2 = :campo2 ';
end if;
if pCampo3 is not null then
vWhere := vWhere || ' and campo3 = :campo3 ';
end if;
if pCampo4 is not null then
vWhere := vWhere || ' and campo4 = :campo4 ';
end if;
-- Se nenhum parâmetro for informado, com exceção do primeiro, que é obrigatório, eu tenho o seguinte comando para me retornar o cursor:
if pCampo2 = 0 and pCampo3 is null and pCampo4 is null then
open pCursor for vQuery || vWhere
using pAtivo;
-- Se APENAS o campo2 for informado, o comando para retornar o cursor precisa de 2 "itens" no "using":
elsif pCampo2 > 0 and pCampo3 is null and pCampo4 is null then
open pCursor for vQuery || vWhere
using pAtivo, pCampo2;
-- Se o campo2 + campo3 forem informados, o comando para retornar o cursor precisa de 3 "itens" no "using":
elsif pCampo2 > 0 and pCampo3 is not null and pCampo4 is null then
open pCursor for vQuery || vWhere
using pAtivo, pCampo2, pCampo3;
-- Se o campo2 + campo3 + campo 4 forem informados, o comando para retornar o cursor precisa de 4 "itens" no "using":
elsif pCampo2 > 0 and pCampo3 is not null and pCampo4 not is null then
open pCursor for vQuery || vWhere
using pAtivo, pCampo2, pCampo3 , pCampo4;
-- continuando os IF´s, seria necessário combinar as outras possibilidades ainda, como, "pcampo2 = 0 and pcampo3 is not null and pcampo 4 is null" OU
-- "pcampo2 = 0 and pcampo3 is not null and pcampo 4 is not null" OU "pcampo2 = 0 and pcampo3 is null and pcampo 4 is not null"
end if;
-- ... agora, o meu caso real, eu tenho OITO parâmetros opcionais que podem ser combinados. é inviável trabalhar com tantas condições.
-- ... Gostaria de alguma opção que eu pudesse ir adicionado os possíveis "binds" já em uma collection e depois, ao abrir o cursor, usar esta collection na clausula using.
-- ... algo tipo:
if pCampo2 > 0 then
vWhere := vWhere || ' and campo2 = :campo2 ';
<<collectionComOsParametrosQuePossuemValores>> := pCampo2;
end if;
if pCampo3 is not null then
vWhere := vWhere || ' and campo3 = :campo3 ';
<<collectionComOsParametrosQuePossuemValores>> := pCampo3;
end if;
if pCampo4 is not null then
vWhere := vWhere || ' and campo4 = :campo4 ';
<<collectionComOsParametrosQuePossuemValores>> := pCampo4;
end if;
open pCursor for vQuery || vWhere
using <<collectionComOsParametrosQuePossuemValores>>
end;
/
Pesquisei muito a respeito e não encontrei nada.
Agradeço a ajuda.
abs,Discussão (1)
Carregando comentários...