Pular para o conteúdo
  • Este tópico contém 13 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 1 mês atrás por Girino.
Visualizando 14 posts - 1 até 14 (de 14 do total)
  • Autor
    Posts
  • #98028
    Girino
    Participante

      Bom Dia..!!

      A minha dúvida é a seguinte: 🙄

      Preciso criar uma tabela temporaria dentro de uma procedure, utilizar as informações desta tabela e depois dropar essa tabela no final da procedure.

      No SQL Server e no Informix eu consigo tranquilamente, porem no oracle estou tendo dificuldades.

      Já tentei de várias maneiras e não consegui.

      Alguém poderia me ajudar?
      Muito Obrigado..!! 😆

      #98030
      leandrolbs
      Participante

        use o EXECUTE IMMEDITATE ;

        http://download.oracle.com/docs/cd/B193 … tement.htm

        ai coloca o script de criação dentro das ” … e no final o drop;.

        #98031
        fsitja
        Participante

          Imagino que provavelmente ele está executando execute immediate e tendo um erro (embora não tenha postado o código do erro).

          Sendo esse o caso, o problema ocorre devido ao fato de stored procedures executarem por padrão com definer’s rights, ou seja, com os privilégios com dono da procedure. Esses privilégios precisam ser atribuídos por grant direto, e não por role.

          Outra alternativa técnica seria definir a procedure como invoker’s rights e delegar ao usuário que executa a procedure os privilégios necessários.

          Entretanto, esse tipo de solução não é uma boa prática. O ideal é evitar, mas se for realmente necessário, use Global Temporary Tables:
          http://download.oracle.com/docs/cd/E118 … ADMIN11633

          O melhor seria avaliar se a tal tabela temporária é realmente necessária ou está sendo criada por conveniência.

          Tem uma analogia muito boa que se aplica aqui:

          Programar é como construir uma casa, por isso muitas vezes há a figura do arquiteto de sistemas.

          Na sua casa ou residência você constrói uma privada cada vez que quer usar o banheiro? Creio que não.

          Da mesma forma, componentes estruturais de um sistema não devem ser construídos em tempo de execução.

          #98032
          Girino
          Participante

            Olá..!! 8)

            Tentei fazer usando conforme você passou mas esta me retornando um erro de tabela locada.

            Dai optei por criar um package com os procedimentos separados. 😀

            Como eu faço para executar ou seja fazer a chamada para esse package? Essa é minha dúvida agora.

            Muito Obrigado..!! 😉

            #98033
            Rodrigo Mesquita
            Participante

              Girino,

              O melhor seria voce criar uma tabela temporária que possa ser utilizada por várias rotinas e deixa-la no banco, sem precisar criar e dropar sempre que for utilizar.

              Ex.

              create global temporary table TABELA TEMP
              ( CAMPO1 VARCHAR2(3000),
              CAMPO2 VARCHAR2(3000),
              CAMPO3 VARCHAR2(3000),
              CAMPO4 VARCHAR2(3000),
              CAMPO5 NUMBER….

              Como esta tabela não possui colunas com nomenclaturas definidas voce pode utilizar em várias rotinas.

              #98034
              Girino
              Participante

                Como faço para fazer a chamada deste package?

                CREATE OR REPLACE PACKAGE TESTANDO IS

                PROCEDURE CHECA_DADOS;

                PROCEDURE ATUALIZA;

                PROCEDURE APAGA_DADOS;

                END;

                Muito Obrigado..!! 😀

                #98035
                Rodrigo Mesquita
                Participante

                  voce chama Package.nome_da_procedure, porem voce tem que declara está procedure na specification da package tambem.

                  ex.:
                  testando.CHECA_DADOS

                  #98037
                  Girino
                  Participante

                    Olá, Tentei fazer assim:

                    CREATE OR REPLACE PACKAGE TESTANDO IS

                    PROCEDURE CHECA_DADOS;

                    PROCEDURE TESTE;

                    PROCEDURE APAGA_DADOS;

                    END;

                    —————————————————————————–

                    Depois criei uma procedure para chamar o Package:

                    CREATE OR REPLACE PROCEDURE ATUALIZA_BASE IS

                    BEGIN

                    TESTANDO.CHECA_DADOS_INFORMIX;
                    TESTANDO.TESTE;
                    TESTANDO.APAGA_DADOS;

                    END;

                    —————————————————————————

                    Tá me retornando a seguinte mensagem:

                    packages body has errors…??????

                    Não Entendi nada..!! 🙄

                    NA VERDADE O QUE EU QUERO É RODAR 3 PROCEDURES, SENDO UMA NA SEQUÊNCIA DA OUTRA. 😥 😥 😥

                    #98038
                    Rodrigo Mesquita
                    Participante

                      Voce criou a package body?

                      #98039
                      Girino
                      Participante

                        Não..!!

                        Eu nem sei o que significa package body?

                        Me ajuda, please..!! 😀

                        #98040
                        Rodrigo Mesquita
                        Participante

                          Voce não precisa criar uma package.

                          Pode criar um procedure que irá chamar as outras 3 procedures

                          CREATE OR REPLACE PROCEDURE ATUALIZA_BASE IS

                          BEGIN

                          PROCEDURE CHECA_DADOS;

                          PROCEDURE TESTE;

                          PROCEDURE APAGA_DADOS;

                          end;

                          #98047
                          Girino
                          Participante

                            Legal, Porem a tabela da primeira procedure fica locada… 😥

                            Quando eu executo separado funciona..!!

                            Tem como resiolver isso? 😆

                            #98113
                            leandrolbs
                            Participante

                              Girino, pelo post
                              https://www.profissionaloracle.com.br/mo … pic&t=4937

                              seu problema já foi resolvido certo?

                              #98116
                              Girino
                              Participante

                                OK..!! 8)

                                Problema resolvido Conforme Link do post anterior..!! 😀 😀 😀

                                Muito Obrigado à Todos..!! 😉

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