Pular para o conteúdo
Visualizando 14 posts - 1 até 14 (de 14 do total)
  • Autor
    Posts
  • #99674
    Avatar de mpvargasmpvargas
    Participante

      Caros Amigos,
      Criei uma view e gostaria de colocar uma variavel para que deseja digitada a data (Mes/Ano)… fiz algumas pesquisas e pelo que vi isso nao é possível, a nao ser que seja criada uma procedure e nela essa tal variavel…
      Sendo assim fiz a procedure, que é bem simples, mas nao estou conseguindo identificar o erro

      create or replace PROCEDURE “P_VERBAS_PROF” (v_data IN CHAR) AS
      BEGIN
      Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
      from srd010 srd, srv010 srv
      where rd_pd in (‘A17′,’A18′,’A19′,’003’)
      and rd_pd = rv_cod
      and srd.D_E_L_E_T_ <> ‘*’
      and rd_datarq = v_data
      order by rd_filial, rd_mat
      ;
      END;

      Error(4,3): PLS-00428: an INTO clause is expected in this SELECT statement

      #99675
      Avatar de felipegfelipeg
      Participante

        [quote=”mpvargas”:18w3uu7h]Caros Amigos,
        Criei uma view e gostaria de colocar uma variavel para que deseja digitada a data (Mes/Ano)… fiz algumas pesquisas e pelo que vi isso nao é possível, a nao ser que seja criada uma procedure e nela essa tal variavel…
        Sendo assim fiz a procedure, que é bem simples, mas nao estou conseguindo identificar o erro

        create or replace PROCEDURE “P_VERBAS_PROF” (v_data IN CHAR) AS
        BEGIN
        Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
        from srd010 srd, srv010 srv
        where rd_pd in (‘A17′,’A18′,’A19′,’003’)
        and rd_pd = rv_cod
        and srd.D_E_L_E_T_ ‘*’
        and rd_datarq = v_data
        order by rd_filial, rd_mat
        ;
        END;

        Error(4,3): PLS-00428: an INTO clause is expected in this SELECT statement[/quote]

        Mpvargas boa tarde

        Seguinte, pra trazer dados de dentro de uma procedure você precisa inserir esses valores dentro de uma váriavel e depois mostrar as variáveis.

        Um exemplo:


        SELECT campo1, campo2, campo3 INTO var1, var2, var3 FROM TABELA;
        dbms_output.put_line (var1 || var2 || var3);

        E outra, se o sistema vai retornar mais de um registro aconselho usar um cursor.

        Depois das alterações se ainda tiver algum problema poste o código que verificamos =)

        Atenciosamente,
        Felipe.

        #99676
        Avatar de burgaburga
        Participante

          Sempre que você coloca uma consulta direto dentro de um bloco PL/SQL (sem usar cursores nem FOR LOOPs) você deve usar a cláusula INTO pra receber o retorno do SELECT, desta forma:

          DECLARE
          l_teste CHAR(1);
          BEGIN
          SELECT dummy INTO l_teste FROM DUAL;
          ...
          ...
          ...
          END;
          /

          Mas me parece que isso não vai te atender… O que você realmente está precisando? Pode explicar um pouco melhor??

          #99679
          Avatar de rmanrman
          Participante

            [quote=”mpvargas”:3s7t1sth]Caros Amigos,
            Criei uma view e gostaria de colocar uma variavel para que deseja digitada a data (Mes/Ano)… fiz algumas pesquisas e pelo que vi isso nao é possível, a nao ser que seja criada uma procedure e nela essa tal variavel…
            Sendo assim fiz a procedure, que é bem simples, mas nao estou conseguindo identificar o erro

            create or replace PROCEDURE “P_VERBAS_PROF” (v_data IN CHAR) AS
            BEGIN
            Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
            from srd010 srd, srv010 srv
            where rd_pd in (‘A17′,’A18′,’A19′,’003’)
            and rd_pd = rv_cod
            and srd.D_E_L_E_T_ ‘*’
            and rd_datarq = v_data
            order by rd_filial, rd_mat
            ;
            END;

            Error(4,3): PLS-00428: an INTO clause is expected in this SELECT statement[/quote]

            Desculpe pelo comentario OFF…

            Esse SELECT me lembra Microsiga Protheus… 😆

            Nome das tabelas tudo codificado, nada humanamente legivel, e coluna D_E_L_E_T_ com * para marcar registro deletado…

            Não tenho saudades disso não… 😀

            #99681
            Avatar de mpvargasmpvargas
            Participante

              Valeu Amigos … obrigado pela ajuda de todos
              Respondendo:

              felipeg => estou tentando usar algo sem cursor (não sei se é possível) para ver se fica mais rápido

              burga => o que eu preciso é bem simples, quero que ao ser executada a procedure seja colocada uma data (mes/ano) e atraves desse valor será exibido o resultado do select… como essa tabela é muito grande, gostaria de pegar os valores de uma view

              rman => isso é microsiga protheus (hehehe) feliz de você que já se livrou disso…

              #99682
              Avatar de burgaburga
              Participante

                [quote=”mpvargas”:3jqz74h4]burga => o que eu preciso é bem simples, quero que ao ser executada a procedure seja colocada uma data (mes/ano) e atraves desse valor será exibido o resultado do select… como essa tabela é muito grande, gostaria de pegar os valores de uma view[/quote]

                Entendi, mas neste caso, se é só pra melhorar o desempenho, essa solução não vai ser diferente de fazer sua consulta direta pela aplicação ou através de uma VIEW. Só se fosse uma view materializada que ia adiantar alguma coisa… E mais, isso se essa procedure for rodada apenas uma vez e todos acessarem os usuários mesmos dados com a mesma data de uma vez. Se a data diferir a todo momento acaba não adiantando nada também…

                Se todos os usuários acessarem com a mesma data, e esta só mudar a cada determinado período, aí o que pode ajudar é você criar uma tabela pra ser populada periodicamente pelo select com a data correta, aí sim ia adiantar alguma coisa no desempenho, sem ter que ficar recriando uma view materializada.

                #99684
                Avatar de mpvargasmpvargas
                Participante

                  Entendi burga
                  Obrigado pela dica
                  Vou tentar uma outra estratégia.

                  #99685
                  Avatar de mpvargasmpvargas
                  Participante

                    Uma dúvida

                    Nessa tabela eu tenho um campo DATA (ano,mes)
                    Se eu criar uma VIEW e nessa view eu definir que a data é maior do que Janeiro de 2010 (201001) por exemplo…
                    Aí, ao invés da pessoa acessar a tabela toda, acessa a VIEW e coloca o mês/ano desejado, tipo

                    SELECT * FROM VIEW
                    WHERE DATA = ‘201105’

                    Isso é válido? Porque nesse caso a View tem somente uns 30% do total da tabela… ou nao adiantaria muita coisa?

                    #99686
                    Avatar de burgaburga
                    Participante

                      Se a view não é materializada não adianta muita coisa… Isso porque sempre o Oracle vai executar a consulta que monta a view quando você consultá-la. Por exemplo (bem tosco mas que dá pra ilustrar um pouco):

                      Se a sua view é da seguinte forma:

                      CREATE VIEW teste AS
                      SELECT dummy FROM dual

                      E você faz um select:
                      SELECT dummy FROM teste WHERE dummy = 'X';

                      Por traz, o oracle está fazendo algo do tipo:
                      SELECT teste.dummy
                      FROM (SELECT dummy FROM dual) teste
                      WHERE teste.dummy = 'X';

                      Ou seja, a sua VIEW vai servir somente pra simplificar algumas coisas… É claro que uma view não serve só praa isso, mas nesse caso, o que eu quero dizer é que você não vai ter o resultado que deseja tanto.

                      Mas, por outro lado, se você criar uma view materializada já é outra história. E ainda você pode indexar a coluna de data na mview pra melhorar ainda mais a performance das suas consultas…

                      #99694
                      Avatar de rmanrman
                      Participante

                        [quote=”burga”:1jexprv6]Se a view não é materializada não adianta muita coisa… Isso porque sempre o Oracle vai executar a consulta que monta a view quando você consultá-la. Por exemplo (bem tosco mas que dá pra ilustrar um pouco):

                        Se a sua view é da seguinte forma:

                        CREATE VIEW teste AS
                        SELECT dummy FROM dual

                        E você faz um select:
                        SELECT dummy FROM teste WHERE dummy = 'X';

                        Por traz, o oracle está fazendo algo do tipo:
                        SELECT teste.dummy
                        FROM (SELECT dummy FROM dual) teste
                        WHERE teste.dummy = 'X';

                        Ou seja, a sua VIEW vai servir somente pra simplificar algumas coisas… É claro que uma view não serve só praa isso, mas nesse caso, o que eu quero dizer é que você não vai ter o resultado que deseja tanto.

                        Mas, por outro lado, se você criar uma view materializada já é outra história. E ainda você pode indexar a coluna de data na mview pra melhorar ainda mais a performance das suas consultas…[/quote]

                        Burga, o raciocínio do nosso amigo não está correto ? O ganho é muito pouco que nem compensa ?

                        Por que seria assim:


                        SELECT *
                        FROM (
                        SELECT *
                        FROM TABELA
                        WHERE DATA >= '201001'
                        ) T
                        WHERE T.DATA = '201105'

                        Como ele disse a condição DATA >= ‘201001’ retornaria 30% da tabela…

                        #99704
                        Avatar de mpvargasmpvargas
                        Participante

                          Caros amigos,

                          … fiquei na dúvida, compensa ou não?

                          Burga, já li algumas coisas sobre “view materializada” mas ainda não implementei… vc poderia me passar um exemplo de como eu poderia fazer?
                          Obrigado

                          #99713
                          Avatar de burgaburga
                          Participante

                            [quote=”rman”:8yd26m3r]Burga, o raciocínio do nosso amigo não está correto ? O ganho é muito pouco que nem compensa ?

                            Por que seria assim:


                            SELECT *
                            FROM (
                            SELECT *
                            FROM TABELA
                            WHERE DATA >= '201001'
                            ) T
                            WHERE T.DATA = '201105'

                            Como ele disse a condição DATA >= ‘201001’ retornaria 30% da tabela…[/quote]

                            É que uma view não materializada não armazena fisicamente os dados de retorno. Então ela sempre vai executar a consulta que a “monta” quando ela for acessada. Isso dá uma falsa impressão de que você só está acessando os 30% dos dados da tabela original, mas antes disso, a consulta que monta a view está sendo executada na tabela original pra poder extrair estes 30%.

                            Burga, já li algumas coisas sobre “view materializada” mas ainda não implementei… vc poderia me passar um exemplo de como eu poderia fazer?

                            http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6002.htm

                            CREATE MATERIALIZED VIEW sua_mview
                            PCTFREE 5 PCTUSED 60
                            TABLESPACE example
                            STORAGE (INITIAL 50K NEXT 50K)
                            USING INDEX STORAGE (INITIAL 25K NEXT 25K)
                            REFRESH START WITH ROUND(SYSDATE + 1) + 11/24
                            NEXT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 15/24
                            AS
                            Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
                            from srd010 srd, srv010 srv
                            where rd_pd in ('A17','A18','A19','003')
                            and rd_pd = rv_cod
                            and srd.D_E_L_E_T_ '*'
                            and rd_datarq > 201001
                            order by rd_filial, rd_mat
                            ;

                            A parte de cima copiei do link, mas são só parametros de storage e refresh da mview…

                            #99714
                            Avatar de rmanrman
                            Participante

                              [quote=”burga”:2xsanbq4][quote=”rman”:2xsanbq4]Burga, o raciocínio do nosso amigo não está correto ? O ganho é muito pouco que nem compensa ?

                              Por que seria assim:


                              SELECT *
                              FROM (
                              SELECT *
                              FROM TABELA
                              WHERE DATA >= '201001'
                              ) T
                              WHERE T.DATA = '201105'

                              Como ele disse a condição DATA >= ‘201001’ retornaria 30% da tabela…[/quote]

                              É que uma view não materializada não armazena fisicamente os dados de retorno. Então ela sempre vai executar a consulta que a “monta” quando ela for acessada. Isso dá uma falsa impressão de que você só está acessando os 30% dos dados da tabela original, mas antes disso, a consulta que monta a view está sendo executada na tabela original pra poder extrair estes 30%.
                              [/quote]

                              É verdade, pra chegar nos 30%, teve o custo do 100% do mesmo jeito…

                              Pode se utilizar particionamento de tabela para melhorar o desempenho ? Ou neste caso, realmente VIEW MATERIALIZADA é a melhor solução ?

                              #99716
                              Avatar de mpvargasmpvargas
                              Participante

                                Burga
                                Obrigado pela ajuda

                                rman
                                essa tabela já é particionada, no caso por ANO, mas mesmo assim ainda fica com muitos registros

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