- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 7 meses atrás por Carlos Alberto Gaspar.
-
AutorPosts
-
18 de abril de 2013 às 8:46 pm #105325Carlos Alberto GasparParticipante
Boa tarde!
Gostaria de saber se alguém ja fez ou sabe como fazer uma função que retorne o resultado de um select com várias linhas.
Agradeço desde já.
Beto
18 de abril de 2013 às 8:56 pm #105326rmanParticipante@betold
A saida é utilizar REF CURSOR como retorno, nunca tive a oportunidade de implementar isso, segue um artigo que da um exemplo utilizando PROCEDURE, mas creio que com FUNCTION também funciona:
http://www.oracle-base.com/articles/mis … rdsets.php
18 de abril de 2013 às 9:54 pm #105327Carlos Alberto GasparParticipante[quote=”rman”:1xfyv4ka]@betold
A saida é utilizar REF CURSOR como retorno, nunca tive a oportunidade de implementar isso, segue um artigo que da um exemplo utilizando PROCEDURE, mas creio que com FUNCTION também funciona:
http://www.oracle-base.com/articles/mis … rdsets.php[/quote]
Tentei fazer assim:
CREATE OR REPLACE FUNCTION fnc_gestao_vista(pin_id_usuario NUMBER, pin_data_inicio DATE, pin_data_final DATE)
RETURN SYS_REFCURSOR
AS
C_RECORD SYS_REFCURSOR;
BEGIN
OPEN C_RECORD FOR
SELECT * FROM seg_nivel;
return C_RECORD;
END;quanto tento rodar (SELECT * FROM FNC_GESTAO_VISTA(1325,’01/04/2013′,’18/04/2013′);) dá este erro:
ORA-00933: comando SQL não encerrado adequadamente
00933. 00000 – “SQL command not properly ended”18 de abril de 2013 às 10:06 pm #105328rmanParticipante@betold
Agora que você postou um exemplo, acho que a solução para esse caso é uma VIEW. Outro ponto a FUNCTION é utilizada aplicando na lista de colunas do SELECT, não no FROM do SELECT.
Pensando melhor, acho que nem faz sentido uma FUNCTION que retorne vários registro, por isso no artigo foi feito com PROCEDURE.
18 de abril de 2013 às 10:45 pm #105329Carlos Alberto GasparParticipante[quote=”rman”:7wsghko6]@betold
Agora que você postou um exemplo, acho que a solução para esse caso é uma VIEW. Outro ponto a FUNCTION é utilizada aplicando na lista de colunas do SELECT, não no FROM do SELECT.
Pensando melhor, acho que nem faz sentido uma FUNCTION que retorne vários registro, por isso no artigo foi feito com PROCEDURE.[/quote]
O Problema da view são os parâmetros de entrada, no exemplo não utilizei, mas preciso destes parâmetros.
O que fazer?
18 de abril de 2013 às 10:53 pm #105330rmanParticipante@betold
O filtro deve ser aplicado no consulta da VIEW. Mas se realmente a VIEW for apenas um simples SELECT em uma tabela, talvez nem faça muito sentido, geralmente a VIEW é usada para encapsular um consulta mais complexa.
Seguindo a ideia seria assim:
CREATE OR REPLACE VIEW V_SEG_NIVEL AS
SELECT * FROM SEG_NIVEL;
Acessando a VIEW e aplicando o filtro:
SELECT *
FROM V_SEG_NIVEL
WHERE pin_id_usuario = :pin_id_usuario
AND pin_data_inicio = :pin_data_inicio
AND pin_data_final = :pin_data_final
19 de abril de 2013 às 12:05 am #105333Carlos Alberto GasparParticipante[quote=”rman”:1e0027wj]@betold
O filtro deve ser aplicado no consulta da VIEW. Mas se realmente a VIEW for apenas um simples SELECT em uma tabela, talvez nem faça muito sentido, geralmente a VIEW é usada para encapsular um consulta mais complexa.
Seguindo a ideia seria assim:
CREATE OR REPLACE VIEW V_SEG_NIVEL AS
SELECT * FROM SEG_NIVEL;
Acessando a VIEW e aplicando o filtro:
[/quote]
SELECT *
FROM V_SEG_NIVEL
WHERE pin_id_usuario = :pin_id_usuario
AND pin_data_inicio = :pin_data_inicio
AND pin_data_final = :pin_data_final
Vou fazer isso mesmo, fica mais fácil.
Vlw pelas dicas.
-
AutorPosts
- Você deve fazer login para responder a este tópico.