- Este tópico contém 13 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 1 mês atrás por
Girino.
-
AutorPosts
-
31 de janeiro de 2011 às 3:17 pm #98028
Girino
ParticipanteBom 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..!! 😆31 de janeiro de 2011 às 4:12 pm #98030leandrolbs
Participanteuse 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;.
31 de janeiro de 2011 às 4:55 pm #98031fsitja
ParticipanteImagino 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 … ADMIN11633O 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.
31 de janeiro de 2011 às 5:49 pm #98032Girino
ParticipanteOlá..!! 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..!! 😉
31 de janeiro de 2011 às 6:31 pm #98033Rodrigo Mesquita
ParticipanteGirino,
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.
31 de janeiro de 2011 às 6:36 pm #98034Girino
ParticipanteComo 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..!! 😀
31 de janeiro de 2011 às 7:03 pm #98035Rodrigo Mesquita
Participantevoce chama Package.nome_da_procedure, porem voce tem que declara está procedure na specification da package tambem.
ex.:
testando.CHECA_DADOS31 de janeiro de 2011 às 9:08 pm #98037Girino
ParticipanteOlá, 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. 😥 😥 😥
31 de janeiro de 2011 às 9:17 pm #98038Rodrigo Mesquita
ParticipanteVoce criou a package body?
31 de janeiro de 2011 às 9:27 pm #98039Girino
ParticipanteNão..!!
Eu nem sei o que significa package body?
Me ajuda, please..!! 😀
31 de janeiro de 2011 às 9:30 pm #98040Rodrigo Mesquita
ParticipanteVoce 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;
31 de janeiro de 2011 às 10:35 pm #98047Girino
ParticipanteLegal, Porem a tabela da primeira procedure fica locada… 😥
Quando eu executo separado funciona..!!
Tem como resiolver isso? 😆
3 de fevereiro de 2011 às 2:15 pm #98113leandrolbs
ParticipanteGirino, pelo post
https://www.profissionaloracle.com.br/mo … pic&t=4937seu problema já foi resolvido certo?
3 de fevereiro de 2011 às 3:33 pm #98116Girino
ParticipanteOK..!! 8)
Problema resolvido Conforme Link do post anterior..!! 😀 😀 😀
Muito Obrigado à Todos..!! 😉
-
AutorPosts
- Você deve fazer login para responder a este tópico.