Oralce 10g diferente de Oracle 11g para SP?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
guilherme_s
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Dom, 07 Dez 2008 7:50 pm
Localização: São Paulo

Olá, estou com um problema para criar uma Stored procedure conforme segue:

Tenho uma aplicação que roda o mesmo script de criação no Oracle 10g e 11g, em ambos os ambientes a sp é criada, mas somente no 10g ela não é compilada e um erro é retornado para o usuário. dizendo que a stored procedure foi criada com advertências.

Após isso acesso o SQL developer compilo a procedure sem nenhuma alteração e tudo fica normal, mas o ideal é que o erro não ocorra como ocorre no 11g. Alguém tem alguma ideia?

Já tentei alterar o begin Execute immediate 'create or replace ...' end, execute 'create or replace ...' e exc 'create or replace ...', sem sucesso.

Talvez sabendo se existe diferença para compilar ou criar a SP no 10g ou 11g.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Guilherme,

Seria legal você passar para os foristas um exemplo dos erros que os usuários se deparam ao compilar a procedure.

Com base nas mensagens de erro, seria possível fazer uma pesquisa e indicar soluções.

Mas você já poderia analisar o seguinte:

- As permissões dos usuários do 10G e 11G onde a procedure é executada são EXATAMENTE AS MESMAS?
- Verifique a linha onde o ORACLE indica ocorrer erro. Por acaso tem alguma package PL/SQL padrão do
oracle (ex: UTL_FILE)?

Abraços,

Sergio Coutinho
guilherme_s
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Dom, 07 Dez 2008 7:50 pm
Localização: São Paulo

Ao tentar criar a procedure gera os seguintes erros:

Criação da procedure:
ORA-24344: êxito com erro de compilação
ORA-06512: line 2

Script de criação:
Begin
execute immediate ' Creater or replace sp_TESTE(
....
';
end;


Ao tentar compilar a procedure via comando "ALTER PROCEDURE sp_TESTE COMPILE;"
é gerado o seguinte error:

LINE/COL ERROR
-------- ----------------------------------------------------------
1/38 PLS-00103: Encontrado o sÝmbolo "" quando um dos seguintes
sÝmbolos era esperado:
<um identificador>
<um identificador delimitado por aspas duplas> current


A procedure tem uma verificação da seguinte forma (if valor <> '' then ) o mais próximo que chega do "".
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Guilherme,

Você está tentando criar uma procedure com EXECUTE IMMEDIATE, e provavelmente está dando pau na criação da procedure porque alguma ASPA deve estar dentro do comando que é processado pelo EXECUTE IMMEDIATE.

Exemplo:
EXECUTE IMMEDIATE 'CREATE OR REPLACE PROCEDURE SP_TESTE (P_PARAMETRO CHAR DEFAULT 'A') ...';

Note o texto " 'A' " dentro do EXECUTE. O oracle pode se perder na hora de compilar o mesmo.

Algumas coisas que você poderia fazer:

A) Extraia o script DDL do EXECUTE IMMEDIATE e tente compilar ele manualmente. Se der pau, tem algum erro de sintaxe na procedure. Se funcionar normalmente, pode ser algum caracter de acentuação ou algum outro caracter especial que entra em conflito com o EXECUTE IMMEDIATE. Revise cuidadosamente, remova espaços desnecessários ou ENTERs da procedure. Mesmo que ache que está tudo correto. Se tiver aspas, verifique como pode tratar as mesmas. Verifique também se não existem caracteres de substituição, tipo o &;

B) Tem certeza que precisa mesmo criar uma procedure em tempo real para executar sua rotina? Você não poderia criar cursores dinãmicos dentro da procedure ou packages com várias versões desta procedure variando os parâmetros? o que te digo é que não me parece boa prática ficar criando objetos (ex: tabelas, procedures, packages, triggers) em tempo real, pois pode dar pau na sua procedure e o objeto criado pode ficar perdido na base;

Abraços,

Sergio Coutinho
guilherme_s
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Dom, 07 Dez 2008 7:50 pm
Localização: São Paulo

Respondendo ao B)
Na verdade é apenas uma vez que a procedure é criada para utilização do sistema, quem está criando ela é uma atualizador do banco de dados. Ao invés de rodar os scripts na mão foi criado um executável para fazer isso.

Existe alguma constante no oracle que poderia substituir o '' vazio?? tipo o EmptyStr por exemplo.
guilherme_s
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Dom, 07 Dez 2008 7:50 pm
Localização: São Paulo

Caro stcoutinho, acho que a ferramente Oracle SQL Developer(2.1.1.64), deve mascara alguma coisa.
Utilizando a ferramenta "Console Oracle Enterprise Managment" (10g) tentei compilar a stored procedure e o erro retornado:
"Núm. Linha # = 1 Núm. Coluna # = 38 Texto do Erro = PLS-00103: Encontrado o símbolo "" quando um dos seguintes símbolos era esperado: <um identificador> <um identificador delimitado por aspas duplas> current ".

Novamente utilizando a ferramenta Developer o erro não ocorre a procedure é compilada. Após isso tentei compilar novamente pelo console do oracle e o erro não ocorreu.

Algum sugestão?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes