Ir para conteúdo

carlossorocaba82

Members
  • Total de itens

    1
  • Registro em

  • Última visita

Reputação

0 Comum

Sobre carlossorocaba82

  1. carlossorocaba82

    "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,
×

Informação importante

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