Chamando uma função PIPELINED dentro de uma Procedure

Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #95051
    Avatar de MucaMuca
    Participante

    Boa Tarde Pessoal,

    Continuo migrando meu banco atual (firebird) para o Oracle, estou tentando chamar uma função PIPELINED atraves de um LOOP,dentro de uma procedure, porem o valor de retorno da função ( para cada registro) esta sendo NULL, sendo que dentro da função os valores sao gerados corretamente. Vamos ao codigo, esse é um teste inicial que estou fazendo:

    — PACOTE —

    create or replace
    PACKAGE PAC_FUN_PIPELINED
    AS
    TYPE TESTANDO IS RECORD (CONTADOR NUMBER);
    TYPE TESTANDO_TABELA IS TABLE OF TESTANDO;

    FUNCTION FUN_GERA_NUMEROS(QTD_NUM NUMBER)
    RETURN TESTANDO_TABELA PIPELINED;
    END PAC_FUN_PIPELINED;

    — FUNÇÃO —
    create or replace
    PACKAGE BODY PAC_FUN_PIPELINED AS
    FUNCTION FUN_GERA_NUMEROS(QTD_NUM NUMBER)
    RETURN TESTANDO_TABELA PIPELINED IS
    v_record TESTANDO;
    BEGIN
    FOR CONT IN 1 .. QTD_NUM LOOP
    V_RECORD.CONTADOR := (CONT * CONT);
    PIPE ROW(V_RECORD);
    END LOOP;

    RETURN;

    END FUN_GERA_NUMEROS;
    END PAC_FUN_PIPELINED;

    — PROCEDURE —

    create or replace
    PROCEDURE V22_TESTE
    (
    E_NADA IN NUMBER
    ) IS
    VAR_TESTE NUMBER;

    BEGIN
    VAR_TESTE := 100;

    FOR FOR_SELECT_1 IN (SELECT CONTADOR INTO VAR_TESTE FROM TABLE (A_OR_NETCONTROL.PAC_FUN_PIPELINED.FUN_GERA_NUMEROS(E_NADA)))
    LOOP
    dbms_output.put_line(VAR_TESTE);
    END LOOP;
    END V22_TESTE;

    ou seja, o valor para VAR_TESTE esta sendo NULL a cada iteração do laço.

    O que esta errado??
    É isso ae..

    Obrigado!!!

    Muca

    #95052
    Avatar de diegomellodiegomello
    Participante

    Opa…
    Olha só..
    Aparentemente, o problema está na sua procedure.
    Testa assim.

    CREATE OR REPLACE PROCEDURE v22_teste(e_nada IN NUMBER) IS
    var_teste NUMBER;

    BEGIN
    var_teste := 100;

    FOR for_select_1 IN (SELECT contador
    FROM TABLE(a_or_netcontrol.pac_fun_pipelined.fun_gera_numeros(e_nada)))
    LOOP
    dbms_output.put_line(for_select_1.contador);
    END LOOP;
    END v22_teste;

    #95053
    Avatar de MucaMuca
    Participante

    [quote=”diegomello”:1wwb5cs9]Opa…
    Olha só..
    Aparentemente, o problema está na sua procedure.
    Testa assim.

    CREATE OR REPLACE PROCEDURE v22_teste(e_nada IN NUMBER) IS
    var_teste NUMBER;

    BEGIN
    var_teste := 100;

    FOR for_select_1 IN (SELECT contador
    FROM TABLE(a_or_netcontrol.pac_fun_pipelined.fun_gera_numeros(e_nada)))
    LOOP
    dbms_output.put_line(for_select_1.contador);
    END LOOP;
    END v22_teste;
    [/quote]

    Valeu Diegomello,
    Funcionou sim… então não consigo fazer um SELECT INTO dentro de um FOR LOOP??!?!

    Acabei fazendo isso em outras procedures prontas, mas como não tinha testado elas pelo fato do banco estar incompleto, não vi problemas, vou altera-las tambem.

    Mas é isso… problema resolvido!!

    Valeu!!!!

    #95054
    Avatar de diegomellodiegomello
    Participante

    Isso mesmo!
    Quando tu usas FOR LOOP no Oracle, tu declaras uma variável para ser usada como o conteúdo da tua query.
    Ex.:


    -- Created on 14/7/2010 by DIEGO_MELLO
    DECLARE
    -- Local variables here
    i INTEGER;
    BEGIN
    -- Test statements here
    FOR rs IN (SELECT 1 coluna
    FROM dual)
    LOOP
    dbms_output.put_line(rs.coluna);
    END LOOP;

    END;

    #95056
    Avatar de fsitjafsitja
    Participante

    Olá,

    Olhando pelo código creio que daria para fazer essa lógica que você está tentando apenas usando um SQL simples, tipo:

    select level * level valor
    from dual
    connect by level <= &contador;

    Exemplo de execução:

    SQL> select level * level valor
    2 from dual
    3 connect by level <= 4;

    VALOR

         1
         4
         9
        16
    

    #95057
    Avatar de diegomellodiegomello
    Participante

    hahahaha
    É verdade!
    Me foquei em descobrir o problema e nem li o código direito 😛

    #95058
    Avatar de MucaMuca
    Participante

    Srs,
    realmente no codigo que eu coloquei a segunda solução funciona melhor, só que esse problema é só um teste mais basico, pra verificar o funcionamento da função retornando uma tabela, o verdadeiro problema é bem mais complexo.

    De qualquer forma, agradeço as respostas, ajudaram e muito.

    Abraço!!

    #95065
    Avatar de fsitjafsitja
    Participante

    Sem problemas 😉

    Importante é que está resolvido.

Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Você deve fazer login para responder a este tópico.
plugins premium WordPress