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/