Pular para o conteúdo
  • Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 8 meses atrás por Carlos Alberto Gaspar.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #105325
    Carlos Alberto Gaspar
    Participante

      Boa tarde!

      Gostaria de saber se alguém ja fez ou sabe como fazer uma função que retorne o resultado de um select com várias linhas.

      Agradeço desde já.

      Beto

      #105326
      rman
      Participante

        @betold

        A saida é utilizar REF CURSOR como retorno, nunca tive a oportunidade de implementar isso, segue um artigo que da um exemplo utilizando PROCEDURE, mas creio que com FUNCTION também funciona:

        http://www.oracle-base.com/articles/mis … rdsets.php

        #105327
        Carlos Alberto Gaspar
        Participante

          [quote=”rman”:1xfyv4ka]@betold

          A saida é utilizar REF CURSOR como retorno, nunca tive a oportunidade de implementar isso, segue um artigo que da um exemplo utilizando PROCEDURE, mas creio que com FUNCTION também funciona:

          http://www.oracle-base.com/articles/mis … rdsets.php[/quote]

          Tentei fazer assim:

          CREATE OR REPLACE FUNCTION fnc_gestao_vista(pin_id_usuario NUMBER, pin_data_inicio DATE, pin_data_final DATE)
          RETURN SYS_REFCURSOR
          AS
          C_RECORD SYS_REFCURSOR;
          BEGIN
          OPEN C_RECORD FOR
          SELECT * FROM seg_nivel;
          return C_RECORD;
          END;

          quanto tento rodar (SELECT * FROM FNC_GESTAO_VISTA(1325,’01/04/2013′,’18/04/2013′);) dá este erro:
          ORA-00933: comando SQL não encerrado adequadamente
          00933. 00000 – “SQL command not properly ended”

          #105328
          rman
          Participante

            @betold

            Agora que você postou um exemplo, acho que a solução para esse caso é uma VIEW. Outro ponto a FUNCTION é utilizada aplicando na lista de colunas do SELECT, não no FROM do SELECT.

            Pensando melhor, acho que nem faz sentido uma FUNCTION que retorne vários registro, por isso no artigo foi feito com PROCEDURE.

            #105329
            Carlos Alberto Gaspar
            Participante

              [quote=”rman”:7wsghko6]@betold

              Agora que você postou um exemplo, acho que a solução para esse caso é uma VIEW. Outro ponto a FUNCTION é utilizada aplicando na lista de colunas do SELECT, não no FROM do SELECT.

              Pensando melhor, acho que nem faz sentido uma FUNCTION que retorne vários registro, por isso no artigo foi feito com PROCEDURE.[/quote]

              O Problema da view são os parâmetros de entrada, no exemplo não utilizei, mas preciso destes parâmetros.

              O que fazer?

              #105330
              rman
              Participante

                @betold

                O filtro deve ser aplicado no consulta da VIEW. Mas se realmente a VIEW for apenas um simples SELECT em uma tabela, talvez nem faça muito sentido, geralmente a VIEW é usada para encapsular um consulta mais complexa.

                Seguindo a ideia seria assim:


                CREATE OR REPLACE VIEW V_SEG_NIVEL AS
                SELECT * FROM SEG_NIVEL;

                Acessando a VIEW e aplicando o filtro:


                SELECT *
                FROM V_SEG_NIVEL
                WHERE pin_id_usuario = :pin_id_usuario
                AND pin_data_inicio = :pin_data_inicio
                AND pin_data_final = :pin_data_final

                #105333
                Carlos Alberto Gaspar
                Participante

                  [quote=”rman”:1e0027wj]@betold

                  O filtro deve ser aplicado no consulta da VIEW. Mas se realmente a VIEW for apenas um simples SELECT em uma tabela, talvez nem faça muito sentido, geralmente a VIEW é usada para encapsular um consulta mais complexa.

                  Seguindo a ideia seria assim:


                  CREATE OR REPLACE VIEW V_SEG_NIVEL AS
                  SELECT * FROM SEG_NIVEL;

                  Acessando a VIEW e aplicando o filtro:


                  SELECT *
                  FROM V_SEG_NIVEL
                  WHERE pin_id_usuario = :pin_id_usuario
                  AND pin_data_inicio = :pin_data_inicio
                  AND pin_data_final = :pin_data_final
                  [/quote]

                  Vou fazer isso mesmo, fica mais fácil.

                  Vlw pelas dicas.

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