Pular para o conteúdo
  • Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 17 anos, 1 mês atrás por Scheidt.
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #84805
    Scheidt
    Participante

      Bom dia.

      Estou com uma missão em migrar para Oracle algumas procedures que se encontram escritas para Sybase/SQL Server, peguei alguns casos que o retorno é o result set.

      A minha dúvida seria como retornar o result set em uma procedure no Oracle, visto que para cada campo retorno do SELECT se faz necessário um variável no INTO.

      Aguardo retorno.

      At.
      Scheidt

      #84806
      Avatar photoLeonardo Litz
      Participante

        Olá Scheidt.

        Teria como vc postar ai o código em Sysbase/ Sql Server para ver se entendo oque vc precisa?

        #84807
        Scheidt
        Participante

          Tem sim, segue um exemplo do código escrito em Sybase/SQL Server.

          CREATE PROCEDURE proc_exp_s_partnumber0
          (@w_ref_id CHAR(20) = NULL, @w_cli_id CHAR(6) = NULL)
          AS
          BEGIN
          SELECT pn_referencia,cli_id,pn_descricao
          FROM tab_partnumber
          WHERE pn_referencia = @w_ref_id
          AND cli_id = @w_cli_id
          END

          Mas para transformar o essa mesma procedure para Oracle fica da seguinte maneira.

          — Criacao de procedure
          CREATE OR REPLACE PROCEDURE dbo.proc_exp_s_partnumber0 (
          vw_ref_id in CHAR := NULL ,
          vw_cli_id in CHAR := null ) IS

          — Declaracoes de variaveis
          v_pn_referencia CHAR(20);
          v_cli_id CHAR(6);
          v_pn_descricao VARCHAR(255);

          BEGIN
          BEGIN
          SELECT pn_referencia , cli_id , pn_descricao
          INTO v_pn_referencia, v_cli_id, v_pn_descricao
          FROM tab_partnumber
          WHERE pn_referencia = vw_ref_id AND cli_id = vw_cli_id ;
          END;
          END;

          Neste caso para cada retorno de um campo do SELECT se faz necessário a declaração de variáveis e a inclusão das variávens após o INTO.
          Só que neste caso vai sempre me trazer o último registro encontrado no SELECT, e o que eu preciso na realidade é o retorno de todo conteúdo do SELECT.

          Espero que tenha sido claro no exemplo!

          At.
          Scheidt

          #84808
          Avatar photoLeonardo Litz
          Participante

            Seguinte Scheidt.

            Para este caso vc deverá criar uma função de pipelined.

            1º Crie um type com as colunas que vc deseja retornar:

            TYPE TYP_TESTE_PIPELINED IS RECORD(
            ITEM_PRINCIPAL VARCHAR2(19),
            ITEM VARCHAR2(19),
            ORDEM NUMBER,
            ORDEM_PRINCIPAL NUMBER,
            GRUPO_VENDA VARCHAR2(20),
            PRINCIPAL VARCHAR2(1)
            );

            2º Crie um table deste type, desta forma vc terá o retorno de um objeto bidimensional:

            TYPE TYP_TB_TESTE_PIPELINED IS TABLE OF TYP_TESTE_PIPELINED;

            3º Crie a função de pipelined:

            FUNCTION itensConsulta(P_COMPONENTE IN VARCHAR2)
            RETURN TYP_TB_TESTE_PIPELINED PIPELINED
            IS
            c number:=0;
            c2 number :=0;
            BEGIN

             FOR DD IN (select distinct c.item,
                                        c.componente,
                                        i.grupo_venda
                          from componentes c,
                                items i
                          where c.item = i.codigo
                            and (c.componente = P_COMPONENTE)
                           order by i.grupo_venda asc,c.item asc) loop
            
                  c2 := c2 + 1;
            
                  registro.ITEM_PRINCIPAL := dd.componente;
                  registro.ITEM := dd.item;
                  registro.GRUPO_VENDA := dd.grupo_venda;
                  registro.ORDEM := c;
                  registro.ORDEM_PRINCIPAL := c2;
                  registro.PRINCIPAL := 'N';
                  pipe row(registro);
            

            end loop;

            return;

            END itensConsulta;

            4º – Para utilizar a função faça:

            select ITEM_PRINCIPAL,
            ORDEM,
            ORDEM_PRINCIPAL,
            PRINCIPAL
            FROM TABLE(itensConsulta(‘1234’));

            Desta forma vc terá o retorno de uma tabela com n registros.
            Vale lembrar tb que utilizando funções de pipelined vc pode descomplicar o código, além de serem mais rapidas que querys complexas.

            Vlw Leonardo Litz

            #84809
            Avatar photoRegis Araujo
            Participante

              Ei amigo.. bom dia!

              pq vc não cria um cursor??? Ai ele irá lhe trazer todo o conteudo do select…

              PROCEDURE SP_proc_exp_s_partnumber0(CCURSOR OUT SP_proc_exp_s_partnumber0.TCursor,
              vw_ref_id in CHAR := NULL ,
              vw_cli_id in CHAR := null) IS

              — Declaracoes de variaveis
              v_pn_referencia CHAR(20);
              v_cli_id CHAR(6);
              v_pn_descricao VARCHAR(255);
              BEGIN

                 OPEN CCURSOR FOR
              

              SELECT pn_referencia , cli_id , pn_descricao
              FROM tab_partnumber
              WHERE pn_referencia = vw_ref_id AND cli_id = vw_cli_id ;

              END SP_proc_exp_s_partnumber0;

              Abraços…

              #84810
              Scheidt
              Participante

                Muito obrigado pelo retorno Leonardo e Regis.

                Estarei repassando ao pessoal a solução.

                At.
                Scheidt

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