Meu nome é Rafael e estou com uma dúvida sobre esta procedure abaixo:
PROCEDURE spFindContratoByAll(
pidUsuario in number,
pidNumero in varchar2(1000),
pidFornecedor in number,
pidSituacao in varchar2(100),
prc OUT sys_refcursor)
IS
v_select_string VARCHAR2(4000):='';
v_where VARCHAR2(10) : ' WHERE '
v_where_condition VARCHAR2(4000) := '';
v_pNumero VARCHAR2(1000) := '';
v_pSituacao VARCHAR2(100) := '';
v_pIdFornecedor number := 0;
BEGIN
if(pidUsuario is null) then
BEGIN
if(pidFornecedor is not null) then
BEGIN
v_where_condition := ' C.IDFORNECEDOR = ' || pidFornecedor || ' ';
END
ELSE
v_where_condition := '';
end;
end if;
if(pidNumero is not null) then
BEGIN
v_where_condition := ' C.IDNUMERO = ' || pidNumero || ' ';
END
ELSE
v_where_condition := '';
end;
END IF;
IF(pidSituacao IS NOT NULL) then
BEGIN
v_where_condition := ' C.ATIVO IN ( ' || pidSituacao || ' ) ';
END
ELSE
v_where_condition := '';
END IF;
v_where_condition := '';
END;
v_select_string := 'SELECT
C.IDCONTRATO,
C.NUMERO,
C.REFERENCIA,
C.INICIOVIGENCIA,
C.FIMVIGENCIA,
C.ATIVO,
C.DESCRICAOCONTRATO,
C.NOMEGERENTE,
C.FISCAL1,
C.MATRICULAFISCAL1,
C.FISCAL2,
C.MATRICULAFISCAL2,
C.CODIGOGERENTE,
C.IDFORNECEDOR, F.RAZAOSOCIAL, F.CNPJ, F.ATIVO AS FORNECEDORATIVO,
C.OBSERVACOES,
C.LICITACAO,
C.DATACADASTRO
FROM TB_TERC_CONTRATO C
INNER JOIN TB_TERC_FORNECEDOR F ON C.IDFORNECEDOR = F.IDFORNECEDOR
' || v_where_condition || '
ORDER BY F.RAZAOSOCIAL;'
open prc for v_select_string;
end;
END spFindContratoByAll;
A IDEIA SERIA O SEGUINTE:
ESTOU QUERENDO MONTAR UMA QUERY DE FORMA DINAMICA POR DENTRO DESSA PROCEDURE. EU TENHO A VARIÁVEL V_SELECT_STRING QUE RECEBE A QUERY. LOGO EM SEGUIDA EU TENHO V_WHERE_CONDITION ONDE EU TENHO FRAGMENTOS DE UM FILTRO.
EXEMPLO
IF(PIDFORNECEDOR IS NOT NULL)THEN
V_WHERE_CONDITION := ' IDFORNECEDOR = ' || PIDFORNECEDOR || ' AND ' ;
IF(PNUMERO IS NOT NULL)THEN
V_WHERE_CONDITION := ' IDNUMERO = ' || PIDFORNECEDOR || ' AND ' ;
SELECT * FROM TBL_CONTRATO
WHERE || V_WHERE_CONDITION || ;
RESUMINDO: A PROCEDURE RECEBE TRÊS PARÂMETROS DE CONSULTA SENDO QUE UM DELES PODE SER PREENCHIDO OU DOIS, OU TODOS OS TRÊS, CASO NÃO SEJE ENTÃO ELE RETORNE TUDO.
MUITO OBRIGADO PELA ATENÇÃO
RAFAEL