Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dionísio

Recuperar dados de um cursor dentro de uma função

Recommended Posts

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

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

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

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

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

Como p_cursor está declarado em f_obtem_detalhe_ir ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

De nada, aprendi a fazer com FUNCTION, só sabia com PROCEDURE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.