Pular para o conteúdo
  • Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 14 anos atrás por Avatar de fsitjafsitja.
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