funcao com retorno pipelined

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
pio_solucao
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 28 Dez 2007 3:18 pm
Localização: arapongas-pr

alguém sabe se é possivel chamar uma funcao com retorno pipelined de modo recursivo?

segue codigo parcial para tentar ilustrar a ideia.

Selecionar tudo

CREATE OR REPLACE FUNCTION FORMULACAO_EXPLODIDA(pPRODUTOBASE    IN NUMBER,
                                                pCARACTERISTICA IN NUMBER,
                                                pFORMULACAO     IN NUMBER,
                                                pPESOTOTAL      IN NUMBER DEFAULT NULL) RETURN tbFORMULAEXPLODIDA PIPELINED AS
                                                 .
                                                 .
                                                 .
BEGIN
   FOR REC IN ITEM_FORMULACAO(pPRODUTOBASE, pCARACTERISTICA, pFORMULACAO) LOOP
      IF REC.BO_POSSUIFORM = 'S' THEN
         SELECT ID_CARACPRODUTOBASE, ID_CARACTERISTICA, ID_FORMULACAO
           INTO vID_CARACPRODUTOBASE, vID_CARACTERISTICA, vID_FORMULACAO
           FROM PRODUTO
          WHERE ID_PRODUTO = REC.ID_PRODUTO;

         --precisaria chamar a mesma funcao aqui............
      ELSE
         vLINHA := tpFORMULAEXPLODIDA(REC.ID_PRODUTO,
                                      REC.QT_FORMULA,
                                      REC.PC_FORMUL_TOTAL);
      END IF;
                                                 .
                                                 .
                                                 .
END FORMULACAO_EXPLODIDA;
e gostaria tambem de saber se vai implementar a mesma pipe row??
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E ai amigo, tudo beleza?? em modo recursivo tem sim, aqui vai um exemplo simples.

Selecionar tudo

CREATE OR REPLACE PACKAGE PCK_CRISTIANO IS

  TYPE reg_registro IS RECORD(
    nome VARCHAR2(30),
    data date);

  type DateTable is table of reg_registro;
  v_aux NUMBER := 0;

  FUNCTION all_date(p_start IN DATE,
                    p_end   IN DATE,
                    psair   IN VARCHAR2 DEFAULT 'N') RETURN datetable
    PIPELINED;
END;


CREATE OR REPLACE PACKAGE BODY PCK_CRISTIANO IS

  FUNCTION all_date(p_start IN DATE,
                    p_end   IN DATE,
                    psair   IN VARCHAR2 DEFAULT 'N') RETURN datetable
    PIPELINED IS
    out_rec reg_registro;
  BEGIN
    v_aux := v_aux + 1;
  
    if v_aux >= 3 then
      return;
    end if;
  
    FOR x IN 1 .. (p_end + 1 - p_start) LOOP
      out_rec.nome := 'Cristiano';
      out_rec.data := p_start + x - 1;
      PIPE ROW(out_rec);
    END LOOP;
  
    for reg in (select *
                  from TABLE(pck_cristiano.all_date(TO_DATE('110107',
                                                            'DDMMYY'),
                                                    TO_DATE('200107',
                                                            'DDMMYY'),
                                                    'S'))) LOOP
      out_rec.nome := reg.nome || ' Julianeti';
      out_rec.data := reg.data;
      PIPE ROW(out_rec);
    END LOOP;
  
    RETURN;
  END;

END;

Selecionar tudo

SQL> select *
  2    from TABLE(pck_cristiano.all_date(TO_DATE('010107', 'DDMMYY'),
  3                                      TO_DATE('100107', 'DDMMYY')))
  4  /

NOME                           DATA
------------------------------ ---------
Cristiano                      01-JAN-07
Cristiano                      02-JAN-07
Cristiano                      03-JAN-07
Cristiano                      04-JAN-07
Cristiano                      05-JAN-07
Cristiano                      06-JAN-07
Cristiano                      07-JAN-07
Cristiano                      08-JAN-07
Cristiano                      09-JAN-07
Cristiano                      10-JAN-07
Cristiano Julianeti            11-JAN-07
Cristiano Julianeti            12-JAN-07
Cristiano Julianeti            13-JAN-07
Cristiano Julianeti            14-JAN-07
Cristiano Julianeti            15-JAN-07
Cristiano Julianeti            16-JAN-07
Cristiano Julianeti            17-JAN-07
Cristiano Julianeti            18-JAN-07
Cristiano Julianeti            19-JAN-07
Cristiano Julianeti            20-JAN-07

20 rows selected.
[]'s!!
pio_solucao
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 28 Dez 2007 3:18 pm
Localização: arapongas-pr

vlw, vou tentar e depois digo se deu certo...... bom final de ano pra você :D
pio_solucao
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 28 Dez 2007 3:18 pm
Localização: arapongas-pr

vlw, deu carto, so tive q fazer um cursor dinamico para chamar o outro for.... mas agora deu certo, vlw pela força :)
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Opa, legal!!! :-o

[]'s!!!!
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:

Aproveito a oportunidade para divulgar um artigo meu sobre Pipelined Table Function:

http://www.fabioprado.net/2010/12/pipel ... -para.html

[]s
Fábio Prado
Responder
  • Informação
  • Quem está online

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