Dionísio 0 Denunciar post Postado Abril 18, 2014 No banco de dados do sistema da empresa em que trabalho existe uma função que pretendo usar para desenvolver uma aplicação para o site da empresa. A função tem mais ou menos essa estrutura: Nome: Funcao_Cad_Usuario Return Retorno Data Inicial IN date Data Final IN date Cod Usuario IN date Cursor OUT RefCursor A minha pergunta é a seguinte: Existe a possibilidade de eu executar uma select pra puxar os dados desse cursor, tipo como se fosse uma tabela? Tipo assim: select Funcao_Cad_Usuario('01/01/2014','31/01/2014','254897',????=>aqui é minha dúvida) from dual. Não sei se esse é o comando correto,mas gostaria de manipular os dados que o cursor traz. Alguém pode me ajudar? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 18, 2014 Seria mais ou menos isto neste exemplo num bloco anônimo. set serveroutput on; declare q RefCursor; begin MINHA_PROCEDURE(q); loop fetch q into a,b,c,d,e; – aqui são as colunas do Cursor da SP / defina conforme seu tipo exit when q%notfound; dbms_output.put_line(a); – aqui entra sua lógica dbms_output.put_line(b); dbms_output.put_line(c); dbms_output.put_line(d); dbms_output.put_line(e); end loop; end; Compartilhar este post Link para o post Compartilhar em outros sites
Dionísio 0 Denunciar post Postado Abril 21, 2014 Blz, mas no meu caso é uma função com parâmetros de entrada. Como faria pra entrar com esses parâmetros e retornar os valores do cursor??? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 Entendi, tentou chamar como um cursor normal ? Um FOR talvez, deve funcionar. Amanhã faço um teste no trabalho e posto aqui. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 O que a FUNCTION retorna ? Qual type ? Um Cursor ? O que eu já vi é uma procedure que recebe parâmetros , entre eles um de IN OUT que o Ref Cursor, outras procedures ou objetos chamas esta SP como no post #2, funciona. pq tem de ser uma Function ? Compartilhar este post Link para o post Compartilhar em outros sites
Dionísio 0 Denunciar post Postado Abril 22, 2014 Bem, olha como ela é. Result é o retorno e p_cursor é o cursor que me traz os resultados que eu preciso. Entendeu?? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 Creio ser isto set serveroutput on; declare P_CURSOR REFCURSOR; vret number; begin vret := f_obtem_detalhe_ir(pcontrato,p_benef,p_datint,p_data_fim,p_cursor,p_benef); LOOP fetch p_cursor into a,b,c,d,e...; – aqui são as colunas do Cursor da SP / defina conforme seu tipo EXIT when p_cursor%NOTFOUND; -– aqui entra sua lógica no exemplo só dbmooutput dbms_output.put_line(a); dbms_output.put_line(b); dbms_output.put_line(c); dbms_output.put_line(d); dbms_output.put_line(e); end LOOP; end; Compartilhar este post Link para o post Compartilhar em outros sites
Dionísio 0 Denunciar post Postado Abril 22, 2014 Tentei dessa forma: E me retornou esse erro: Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 Como p_cursor está declarado em f_obtem_detalhe_ir ? Compartilhar este post Link para o post Compartilhar em outros sites
Dionísio 0 Denunciar post Postado Abril 22, 2014 Assim: Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 tente set serveroutput on; declare P_CURSOR REF CURSOR; vret number; begin vret := f_obtem_detalhe_ir(pcontrato,p_benef,p_datint,p_data_fim,p_cursor,p_benef); LOOP fetch p_cursor into a,b,c,d,e...; – aqui são as colunas do Cursor da SP / defina conforme seu tipo EXIT when p_cursor%NOTFOUND; -– aqui entra sua lógica no exemplo só dbmooutput dbms_output.put_line(a); dbms_output.put_line(b); dbms_output.put_line(c); dbms_output.put_line(d); dbms_output.put_line(e); end LOOP; end; Compartilhar este post Link para o post Compartilhar em outros sites
Dionísio 0 Denunciar post Postado Abril 22, 2014 Tentei isso aqui... set serveroutput on 1000000 declare Q SYS_REFCURSOR; vret number; COD_CONTRATO number(8); COD_BENEF varchar2(13); NOME varchar2(200); TIPO_DEPENDENCIA varchar2(30); VALOR number(8,2); ORDEM number(5); begin vret := f_obtem_detalhe_ir(32765,7900000220003,'01/01/2013','31/12/2013',Q,''); LOOP fetch Q into COD_CONTRATO,COD_BENEF,NOME,TIPO_DEPENDENCIA,VALOR,ORDEM; --– aqui são as colunas do Cursor da SP / defina conforme seu tipo EXIT when Q%NOTFOUND; insert into tmp_dados_cursor values(COD_CONTRATO,COD_BENEF,NOME,TIPO_DEPENDENCIA,VALOR,ORDEM); end LOOP; end; Ele executou, mas não inseriu nenhuma linha na tabela tmp_dados_cursor. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 Executou a query contida em f_obtem_detalhe_ir com os parâmetros passados ? A query retorna alguma coisa ? Compartilhar este post Link para o post Compartilhar em outros sites
Dionísio 0 Denunciar post Postado Abril 22, 2014 Com o script anterior eu consegui, só faltava eu dar o commit pra poder gravar na tabela. Valew mesmo pela força. Muito obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 22, 2014 De nada, aprendi a fazer com FUNCTION, só sabia com PROCEDURE. Compartilhar este post Link para o post Compartilhar em outros sites