Retornando um cursor

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Pessoal, preciso de um help....eu recebo os parametros e uma procedure, faço um cursor e quero retornar o cursor para a aplicação...como eu faço?...podem me ajudar?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Precisa retornar o cursor montado ou, o retorno mesmo dele?
Não poderia retornar um ref_cursor?
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

quero retornar o conteudo do cursor, somente os dados.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Seguinte, se te retornar um Type (Pl/Sql table) não resolve?

Se for isso, aqui no fórum tem um monte de exemplos, caso contrário, dá pra lhe retornar um ref cursor, que é o que a gente faz aqui pra galera do .NET ler.

Alguma das soluções lhe ajuda?
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Trevisoli, primeiro muito obrigado pela atenção. o bloco da procedure é exatamente como está a baixo.

é uma procedure de consulta, um sistema feito em DOT NET chama esta procedure passando os parametros que, para funcionar, deverá ser retornado o cursor com os dados, ficou mais claro agora? só que não sei como retornar esses dados para o DOT NET, sei que tenho que retornar o cursor para funcionar, mas não sei como fazer isso.

Selecionar tudo

procedure p1 (p_1 in number, p_2 in number) is
     cursor  c_1 is
        select *
          from tb_1, tb_2
         where tb_1.coluna1 = tb_2.coluna1
           and tb_1.coluna2 = p_1
           and tb_1.coluna3 = p_2;

       reg_c_1  c_1%rowtype;

begin

    open c_1;
    loop

       fetch c_1 in reg_c_1;
       exit when c_1%type;

       -- retornar o cursor aqui!!!!

    end loop;
    close c_1;

end;

obs: outra coisa, se não for abuso, como eu faço para a procedure ao invés receber os parametros como parametros, receber por meio de XML?

Valeu cara :-o
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Então brow,

Sobre o .NET, faz um retorno de ref cursor mesmo (dá uma melhorada neste exemplo):

Selecionar tudo

-- 1) Criar type na spec
  TYPE tcursor IS REF CURSOR;

-- 2) Procedure na body da PCK  

  PROCEDURE pvalidacursor (p1 IN NUMBER,
                           p2 IN NUMBER,
                           pretorno  OUT tcursor
  ) 
  IS
  BEGIN
    OPEN pretorno FOR
    SELECT TB_1,CAMPOA, 
               TB_2.CAMPOB
      FROM TB_1, TB_2 
     WHERE TB_1.COLUNA1 = TB_2.COLUNA1 
       AND TB_1.COLUNA2 = P_1 
       AND TB_1.COLUNA3 = P_2;
  EXCEPTION
   WHEN OTHERS THEN 
     dbms_output.put_line('Erro aqui: ');
  END;    
Sobre o XMLTYPE eu nunca trabalhei desta forma, mas, faz um teste ai com esse trechinho que monntei aqui e veja se consegue:

Selecionar tudo

DECLARE
 PROCEDURE PTESTES(pcod sys.xmltype)
 IS
 BEGIN
   dbms_output.put_line('teste ');
 END;
BEGIN
 dbms_output.put_line('teste2 '); 
END;   
Qualquer coisa, manda pra gente.
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

olha como ficou meu código:...mas tem certeza de que assim retorna para aplicação?

Selecionar tudo

PROCEDURE PBEA_CONSULTA_LANCTO_CONTAB_PR(p_cod_mpresa  in LANCTO_CONTABIL.lcon_dpef_cod_empresa%type,
                                         p_cod_filial  in LANCTO_CONTABIL.lcon_dpef_cod_filial%type,
                                         p_origem      in LANCTO_CONTABIL.lcon_origem%type,
                                         p_periodo     in LANCTO_CONTABIL.lcon_dat_movto%type,
                                         p_ciclo       in varchar2,
                                         p_cod_serv    in ITEM_CONTABIL.icon_cod_servico%type,
                                         p_seg_neg     in ITEM_CONTABIL.icon_seg_negocio%type,
                                         p_cont_contab in ITEM_CONTABIL.icon_cod_cont_contabil%type,
                                         p_cent_custo  in ITEM_CONTABIL.icon_cod_cen_custo%type,
                                         p_retorno  OUT c_cursor) IS
                                         
     TYPE c_cursor IS REF CURSOR;
          
BEGIN
     open p_retorno for
          select *
          from LANCTO_CONTABIL lc,
               ITEM_CONTABIL ic
          where lc.lcon_ide_bea   = ic.icon_lcon_ide_bea
            and lc.lcon_origem    = p_origem
            and lc.lcon_dat_movto = p_periodo
            and lc.lcon_dpef_cod_empresa = p_cod_mpresa
            and lc.lcon_dpef_cod_filial  = p_cod_filial
             or (ic.icon_seg_negocio       = p_seg_neg     or
                 ic.icon_cod_cen_custo     = p_cent_custo  or
                 ic.icon_cod_cont_contabil = p_cont_contab or
                 ic.icon_cod_servico       = p_cod_serv);
                 -- campo do parametro p_ciclo)
END;
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

minha procedure nem compila, dá erro no paremtro p_retorno OUT c_cursor. dizendo q c_cursor deve ser declarado.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

É porque esse parametro de OUT deve ser declarado antes da utilização, ou seja, na SPEC de uma package por exemplo.

Outra coisa, retornar vai sim, à não ser que tua query não retorne nada.

Só uma Dica, eu não retornaria um "Select *", mas, sim, nomearia cada coluna do retorno, pois não sei se pode ter algum tipo de problema no .NET.


Qualquer coisa, manda pra gente.
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

mas não estou utilizando uma package. fiz a declaracao do cursor a cima assim: TYPE c_cursor IS REF CURSOR;

mas não adiantou.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, seguinte, pra se usar o TYPE, ele deve ser de Banco, ou, declarado global, dentro de uma Package, por exemplo.

Mas, se quiseres fazer num bloco anônimo, dá uma olhada neste código abaixo.

Selecionar tudo


DECLARE 
  -- Declaro type antes de utilizar na procedure
  TYPE tcursor IS REF CURSOR;

  vret tcursor;
    
  PROCEDURE pteste (pid IN NUMBER DEFAULT 1,
                    pretorno OUT tcursor)
  IS
    vretint tcursor;
  BEGIN
    -- abro o select para retorno
    dbms_output.put_line('Antes do Retorno.');
    OPEN vretint FOR  SELECT 1 FROM dual;
    dbms_output.put_line('Depois do Retorno ');
  END;                  

  
BEGIN
   -- Utilizo o retorno na aplicação 
  pteste(1,vret);  
END;  

Qualquer dúvida, manda pra gente.
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

ok...só funciona assim passando para a procedure?....é que é uma procedure muito pequena, exatamente do tamanho desse bloco q você colocou(mas irá retornar um milhão de registros) e por isso eu não queria fazer uma package, mas vou fazer uma procedure chamando uma outra passando esses parametros.


valeu! :D
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Cara, não está funcionando não. veja bem, minha rotina é exatamente essa a baixo e tenho q retornar o cursor para a aplicação dot .net, mas não está funcionando está dando erro nesta linha "p_retorno OUT c_cursor"....como eu faço?...te confesso q eu nunca fiz uma procedure retornando o cursor.

Selecionar tudo

PROCEDURE PBEA_CONSULTA_LANCTO_CONTAB_PR(p_cod_mpresa  in TBEA_LANCTO_CONTABIL.lcon_dpef_cod_empresa%type,
                                         p_cod_filial  in TBEA_LANCTO_CONTABIL.lcon_dpef_cod_filial%type,
                                         p_origem      in TBEA_LANCTO_CONTABIL.lcon_origem%type,
                                         p_periodo     in TBEA_LANCTO_CONTABIL.LCON_ANOMES_MOVTO%type,
                                         p_tip_doc     in varchar2,
                                         p_divisao     in varchar2,
                                         p_local_neg   in TBEA_ITEM_CONTABIL.icon_seg_negocio%type,
                                         p_ciclo       in varchar2,
                                         p_cod_serv    in TBEA_ITEM_CONTABIL.icon_cod_servico%type,
                                         p_cont_contab in TBEA_ITEM_CONTABIL.icon_cod_cont_contabil%type,
                                         p_num_doc_contab  in varchar2,
                                         p_cent_custo      in TBEA_ITEM_CONTABIL.icon_cod_cen_custo%type,
                                         p_cent_lucro      in TBEA_ITEM_CONTABIL.icon_cod_cen_lucro%TYPE,
                                         p_evento          in TBEA_ITEM_CONTABIL.icon_cod_evento%type,
                                         p_cod_munic       in varchar2,
                                         p_cnpj            in TBEA_ITEM_CONTABIL.icon_num_cnpj%type,
                                         p_cpf             in TBEA_ITEM_CONTABIL.icon_num_cpf%type,
                                         p_num_nf          in number,
                                         p_retorno     OUT c_cursor) IS
                                         
     TYPE c_cursor IS REF CURSOR;
          
BEGIN

     open p_retorno for
     select lc.LCON_IDE_BEA, lc.LCON_ANOMES_MOVTO, lc.LCON_ORIGEM, lc.LCON_DPEF_COD_EMPRESA,
            lc.LCON_DPEF_COD_FILIAL, lc.LCON_DAT_DOCTO, lc.LCON_TIP_DOCTO, lc.LCON_DAT_LANCTO,
            lc.LCON_TEX_CAB, lc.LCON_IND_TIP_LANCTO, lc.LCON_IND_ANA_SINT, lc.LCON_IND_AGRUPAMENTO,
            lc.LCON_REF_LANC, ic.ICON_COD_CONT_CONTABIL, ic.ICON_COD_LOC_NEGOCIO, ic.ICON_COD_DIVISAO,
            ic.ICON_COD_SERVICO, ic.ICON_SEG_NEGOCIO, ic.ICON_NUM_CICLO_FATUR, ic.ICON_CHA_LANCTO, ic.ICON_COD_AGENTE,
            ic.ICON_COD_CEN_CUSTO, ic.ICON_COD_CEN_LUCRO, ic.ICON_UNI_MEDIDA, ic.ICON_QTD_FATURADA, ic.ICON_DAT_REF_TRAFEGO,
            ic.ICON_VAL_LAN_CONTABIL, ic.ICON_DES_ATRIBUICAO, ic.ICON_DES_HISTORICO, ic.ICON_COD_EVENTO, ic.ICON_NUM_CNPJ,
            ic.ICON_NUM_CPF, ICON_DAT_VENCTO, ic.ICON_COD_HIS_padrão, ic.ICON_NUM_IBGE, ic.ICON_COD_PARTICIPANTE,
            ic.ICON_LCON_IDE_BEA, ic.ICON_ITEM_CONTABIL
       from TBEA_LANCTO_CONTABIL lc,
            TBEA_ITEM_CONTABIL ic
      where lc.lcon_ide_bea          = ic.icon_lcon_ide_bea
        and lc.lcon_origem           = p_origem
        and lc.LCON_ANOMES_MOVTO     = p_periodo
        and lc.lcon_dpef_cod_empresa = p_cod_mpresa
        and lc.lcon_dpef_cod_filial  = p_cod_filial
         or (ic.icon_seg_negocio       = p_seg_neg     or
             ic.icon_cod_cen_custo     = p_cent_custo  or
             ic.icon_cod_cont_contabil = p_cont_contab or
             ic.icon_cod_servico       = p_cod_serv    or
             ic.icon_seg_negocio       = p_local_neg   or
             ic.icon_cod_servico       = p_cod_serv    or
             ic.icon_cod_cont_contabil = p_cont_contab or
             ic.icon_cod_cen_custo     = p_cent_custo  or
             ic.icon_cod_cen_lucro     = p_cent_lucro  or
             ic.icon_cod_evento        = p_evento      or
             ic.icon_num_cnpj          = p_cnpj        or
             ic.icon_num_cpf           = p_cpf);
             
END; -- Procedure
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

O erro é exatamente o que lhe informei anteriormente:
Você está tentando passar por parâmetro um objeto que ainda não foi criado (c_cursor) e, está criando este objeto dentro da procedure.
Daí dá erro.

Faz um teste velho, cria este objeto na spec de uma package que não tem como dar erro.
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

me responde uma coisa....essa consulta, essa package irá retornar mais de um milhão de registro, eu fazendo dessa forma irá diminuir a performance?

e problema é meu chefe não aceitar uma package, esse é o problema...só tem esse jeito mesmo??
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitante