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