Alex,

Consegui resolver, com sua dica me ajudou.

Segue o código final..... Estou utilizando dessa forma para recuperar
dados com php.


    PROCEDURE CONS_MENSAGENS(P_EMAIL IN TBL_MAILTOFAX.EMAIL%TYPE,
                             P_CONS  OUT CT_CONSMSENSAGE,
                             P_DTINICIAL  IN VARCHAR2,
                             P_DTFINAL    IN VARCHAR2,
                             P_ASSUNTO    IN
TBL_MAILTOFAX_MENSAGENS.ASSUNTO%TYPE,
                             P_CODIGOERRO IN
TBL_MAILTOFAX_MENSAGENS.CODIGO_ERRO%TYPE)
    IS
      TYPE TEMP IS REF CURSOR;
      V_SQL LONG;
      CURSOR_TMP TEMP;

    BEGIN
       V_SQL := 'SELECT A.ID, A.ID_CLI, A.COD_EMP, A.COD_SERV, A.EMAIL,
             TO_CHAR(A.DT_HR_RECEPCAO, ''DD/MM/YYYY HH24:MI:SS'') AS
RECEPCAO,
             A.TEXTO_EMAIL, A.ASSUNTO, A.ID_MENSAGEM_ORIGINAL, A.CODIGO_ERRO,
             B.QTD_DESTINO
          FROM TBL_MAILTOFAX_MENSAGENS A,
               (SELECT ID_MENSAGEM, COUNT(*) AS QTD_DESTINO
                FROM TBL_MAILTOFAX_DESTINOS
                GROUP BY ID_MENSAGEM) B
          WHERE A.ID = B.ID_MENSAGEM
          AND UPPER(A.EMAIL) = UPPER('''||P_EMAIL||''')';
       IF P_DTINICIAL IS NOT NULL THEN
          V_SQL := V_SQL ||' AND A.DT_HR_RECEPCAO >= '||P_DTINICIAL;
       END IF;

       IF P_DTFINAL IS NOT NULL THEN
          V_SQL := V_SQL ||' AND A.DT_HR_RECEPCAO <= '||P_DTFINAL;
       END IF;

       IF P_ASSUNTO IS NOT NULL THEN
          V_SQL := V_SQL ||' AND A.ASSUNTO LIKE '||P_ASSUNTO;
       END IF;

       IF P_CODIGOERRO IS NOT NULL THEN
          V_SQL := V_SQL ||' AND A.CODIGO_ERRO = '||P_CODIGOERRO;
       END IF;

       V_SQL := V_SQL ||' ORDER BY A.DT_HR_RECEPCAO ASC';

       OPEN CURSOR_TMP FOR V_SQL;
       P_CONS := CURSOR_TMP;

    END CONS_MENSAGENS;

Valeu
Thiago



Alex Rodrigues escreveu:
> PROCEDURE CONS_MENSAGENS(P_EMAIL IN TBL_MAILTOFAX.EMAIL%TYPE,
>        P_CONS OUT CT_CONSMSENSAGE,
>        P_DTINICIAL IN TBL_MAILTOFAX_MENSAGENS.DT_HR_RECEPCAO%TYPE DEFAULT
> ADD_MONTHS(SYSDATE, -3),
>        P_DTFINAL IN TBL_MAILTOFAX_MENSAGENS.DT_HR_RECEPCAO%TYPE DEFAULT
>        SYSDATE,
>        P_ASSUNTO IN TBL_MAILTOFAX_MENSAGENS.ASSUNTO%TYPE DEFAULT '%',
>        P_CODIGOERRO IN TBL_MAILTOFAX_MENSAGENS.CODIGO_ERRO%TYPE DEFAULT 0)
>  IS
>     l_curs_sql               long;
>     v_curs_sel               varchar2(4000) := null;
>     curs_dyncur              reccurtype;
>   BEGIN
>    v_curs_sel := '
>    SELECT A.ID, A.ID_CLI, A.COD_EMP, A.COD_SERV, A.EMAIL,
>    TO_CHAR(A.DT_HR_RECEPCAO, 'DD/MM/YYYY HH24:MI:SS') AS RECEPCAO,
>    A.TEXTO_EMAIL, A.ASSUNTO, A.ID_MENSAGEM_ORIGINAL, A.CODIGO_ERRO,
>    B.QTD_DESTINO
>    FROM TBL_MAILTOFAX_MENSAGENS A,
>    (SELECT ID_MENSAGEM, COUNT(*) AS QTD_DESTINO
>    FROM TBL_MAILTOFAX_DESTINOS
>    GROUP BY ID_MENSAGEM) B
>    WHERE A.EMAIL = P_EMAIL
>    AND A.ID = B.ID_MENSAGEM
>    ORDER BY A.DT_HR_RECEPCAO ASC';
>    if prarametro then
>    v_curs_sql := v_curs_sql + 'PARAMETROS';
>
>    l_curs_sql := v_curs_sel;
>    open curs_dyncur for l_curs_sql;
>   loop
>    fetch curs_dyncur
>    exit when curs_dyncur%notfound;
>   end loop;
>
> END CONS_MENSAGENS;
>
> Vê se te ajuda,
> Att,
>
>
> 2009/8/10 Thiago Menon <thime...@yahoo.com.br>
>
>   
>>
>> Olá,
>>
>> Gostaria de saber como posso fazer com que uma função possa montar e
>> executar um query variável dependendo dos parâmetros?
>>
>> Segue minha procedure e abaixo a explicação.
>>
>> PROCEDURE CONS_MENSAGENS(P_EMAIL IN TBL_MAILTOFAX.EMAIL%TYPE,
>> P_CONS OUT CT_CONSMSENSAGE,
>> P_DTINICIAL IN TBL_MAILTOFAX_MENSAGENS.DT_HR_RECEPCAO%TYPE DEFAULT
>> ADD_MONTHS(SYSDATE, -3),
>> P_DTFINAL IN TBL_MAILTOFAX_MENSAGENS.DT_HR_RECEPCAO%TYPE DEFAULT
>> SYSDATE,
>> P_ASSUNTO IN TBL_MAILTOFAX_MENSAGENS.ASSUNTO%TYPE DEFAULT '%',
>> P_CODIGOERRO IN TBL_MAILTOFAX_MENSAGENS.CODIGO_ERRO%TYPE DEFAULT 0)
>> IS
>> BEGIN
>> OPEN P_CONS FOR
>> SELECT A.ID <http://a.id/>, A.ID_CLI, A.COD_EMP, A.COD_SERV, A.EMAIL,
>> TO_CHAR(A.DT_HR_RECEPCAO, 'DD/MM/YYYY HH24:MI:SS') AS RECEPCAO,
>> A.TEXTO_EMAIL, A.ASSUNTO, A.ID_MENSAGEM_ORIGINAL, A.CODIGO_ERRO,
>> B.QTD_DESTINO
>> FROM TBL_MAILTOFAX_MENSAGENS A,
>> (SELECT ID_MENSAGEM, COUNT(*) AS QTD_DESTINO
>> FROM TBL_MAILTOFAX_DESTINOS
>> GROUP BY ID_MENSAGEM) B
>> WHERE A.EMAIL = P_EMAIL
>> AND A.ID <http://a.id/> = B.ID_MENSAGEM
>> ORDER BY A.DT_HR_RECEPCAO ASC;
>>
>> END CONS_MENSAGENS;
>>
>> Caso seja passado algum dos seguintes parametros P_DTINICIAL, P_DTFINAL,
>> P_ASSUNTO e/ou P_CODIGOERRO de ser atribuido a condição referente a esse
>> parâmetro.
>>
>> Sendo:
>>
>> Se P_DTINICIAL is not null adiciona AND A.DT_HR_RECEPCAO >= P_DTINICIAL
>> na clausula.
>> Se P_DTFINAL is not null adicionar AND A.DT_HR_RECEPCAO <= P_DTFINAL na
>> clausula.
>> Se P_ASSUNTO is not null adicionar AND A.ASSUNTO LIKE P_ASSUNTO||'%' na
>> clausula.
>> Se P_CODIGOERRO is not null adicionar AND A.CODIGO_ERRO = P_CODIGOERRO
>> na clausula.
>>
>> É possível sem ter que fazer um função para cada filtro?
>>
>> Agradeço a ajuda de todos.
>> Thiago
>>
>> __________________________________________________
>> Faça ligações para outros computadores com o novo Yahoo! Messenger
>> http://br.beta.messenger.yahoo.com/
>>
>>
>>     
>
>
>
>   
__________________________________________________
Faça ligações para outros computadores com o novo Yahoo! Messenger 
http://br.beta.messenger.yahoo.com/ 

Responder a