Erro ORA-01040 na execução de um fmb

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Bom dia,
suplico uma solução para o seguinte problema:
Possuo um programa (fmb) que é utilizado para manter uma tabela de parâmetros. Está tabela possui 406 colunas.
Esta tabela sempre irá possuir apenas 01 registro.
Durante a inclusão de 03 novos campos neste programa, ao tentar salvar duas vezes com o programa em execução ocorre o erro ORA-01040.
Vou tentar exemplificar:
Cenário 01:
01) acesso o programa;
02) Altero qualquer campo;
03) Executo commit;
----Não occorre nenhum erro;

Cenário 02 - Erro:
01) acesso o programa;
02) Altero qualquer campo;
03) Executo commit;
04) Altero outro campo (pode ser o mesmo);
05) executo commit;
06) Ocorre o erro e a aplicação perde a conexão com o banco;

Uma coisa que descobri é que o erro está ocorrendo de acordo com a quantidade total dos caracteres dos campos presentes na tela. Lembrando que o erro ocorre apenas na segunda tentativa de salvar o registro, na primeira não ocorre erro algum.

Alguém já passou por isso anteriormente? Será que é um problema na versão do forms?
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Ola Tora34,

Eu procurei até no metalink sobre a mensagem de erro ORA-01040 e Oracle Forms, mas não encontrei nenhuma referência.

A mensagem de erro ORA-01014 indica uma falha de login, e pode estar relacionado com o uso de caracteres acentuados (ÁÉÚÇÜ...). Sua senha de acesso ao banco é normal ou apresenta caracteres acentuados?

O que você poderia fazer é um trace de sua sessão de forms ou sessão SQL associada ao mesmo. Eu não sou especialista FORMS, mas talvez algum forista possa lhe fornecer maiores detalhes de como proceder para obter o trace.

Pode ser que este trace do forms ou da sessão SQL te apresente uma "mensagem de erro escondida", que aponte o problema real com o seu forms.

Você poderia também criar uma trigger para capturar erros de banco de dados no schema que você tem as tabelas acessadas por seu forms. Mas, pela mensagem de erro relatada, o problema parece se situar mais do lados do forms.

Abraços e boa sorte !

Sergio Coutinho
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Boa noite,
Obrigado pelo retorno Sergio.
Já realizei o trace da sessão para tentar identificar o erro. E nada.... :(
Acredito que realmente o problema é que uma única tabela possua tantos campos, e todos estes campos estão referenciados em uma única aplicação (fmb).
Tendo em vista que o forms executa implicitamente comandos DML será que possui alguma restrição na quantidade de caracteres, somando todos os caracteres da transacção?. Sei que o máximo aceito para uma UPDATE/INSERT em um único campo é de 4000 caracteres, sera que a restrição é está?
Alguém sabe se um update/insert possui alguma restrição de tamanho?
a solução adotada foi criar dois forms para manter a mesma tabela. O usuário final não irá perceber que mudou de programa.

Valeu Obrigado
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá tora34,

Existe uma limitação de quantidade de caracteres para processamento de comandos DML, mas não sei se ela poderia se aplicar ao FORMS.

Você pode então optar por uma trigger para captura de erros

Selecionar tudo

CREATE OR REPLACE TRIGGER <SEU SCHEMA>.TGR_CAPTURA_ERRO
AFTER SERVERERROR  ON <SEU_SCHEMA>.SCHEMA
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
   SQL_TEXT ORA_NAME_LIST_T;
   V_STMT CLOB;
   N NUMBER;
BEGIN
  --
  N := ORA_SQL_TXT(SQL_TEXT);
  --
  IF N >= 1 THEN
     FOR I IN 1..N LOOP
         V_STMT := V_STMT || SQL_TEXT(I);
     END LOOP;
  END IF;
  --
  FOR N IN 1..ORA_SERVER_ERROR_DEPTH LOOP
      --
      << COLOQUE AQUI UM COMANDO DE INSERT EM UMA TABELA DE LOG
           POSSIVEIS CAMPOS PARA SEREM COLETADOS SERIAM:
                    SYSDATE                                  (DATA OCORRENCIA ERRO),
                    ORA_LOGIN_USER                    (USUARIO BANCO),
                    ORA_CLIENT_IP_ADDRESS         (TERMINAL),
                    ORA_SERVER_ERROR(N)            (CODIGO DE ERRO ORA-),
                    ORA_SERVER_ERROR_MSG(N)    (TEXTO MENSAGEM DE ERRO),
                    V_STMT                                    (COMANDO QUE GEROU O ERRO)
      COMMIT;
  END LOOP;
END TGR_CAPTURA_ERRO;
...
Como pode ver, não teria aqui uma TRIGGER 100% pronta, mas você deve criar a mesma para o usuário através do qual o seu FORMS faz conexão. Pesquise na internet sobre ORACLE AND TRIGGER ANS SERVERERROR.

Todos os erros de DML que ocorrecem no schema seria capturados por esta trigger. Tente compilar no usuário onde você faz a conexão. Exemplo: Se o seu schema se chama GEO e o usuario de conexão se chama GEOUSER, esta trigger precisa ser compilada no usuario GEOUSER ( ... AFTER SERVERERROR ON GEOUSER.SCHEMA). Se tiver dúvidas sobre qual seria o usuário de conexão/processamento dos comandos, crie a trigger em cada um dos usuários candidatos.

Não se esqueça também de criar a tabela para armazenar os erros de LOG. Crie o campo que armazenará o comando como campo CLOB.

Tenho certeza que se estiver ocorrendo algum erro na execução do comando DML no forms, ele será capturado por esta trigger.

Boa sorte,

Sergio Coutinho
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Obrigado Sergio,
vou tentar isso.
Depois aviso se deu certo.

Valeu
paulachrys
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 02 Set 2014 4:43 pm
Localização: Florianópolis

tora34 COnseguiu resolver teu problema?
Também tenho uma tela, que na segunda tentativa de alteração dá erro e perde a conexão.
Só que o meu erro é o : "ORA-12203: TNS: unable to connect to destination" .
:(
Obrigada
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Boa tarde,
identifiquei que o problema estava ligado a quantidade de campos existentes em tela, e o erro era relacionado a quantidade de caracteres utilizado pelo forms para processar o comando DML.
Para corrigir e evitar este erro, deve-se alterar a propriedade do bloco "Update Changed Columns Only" para "YES" , Assim, durante a atualização apenas as colunas que foram alteradas são utilizadas no comando DML do Forms.
paulachrys
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 02 Set 2014 4:43 pm
Localização: Florianópolis

Cara, simplesmente não acredito, alterei essa configuração e funcionou! Bah, faz meeeeses que to lidando nisso
e não tinha achado uma solução. Realmente a minha tela também, tem muitos campos.
Muito Obrigadaaaaaaaaaaaaa :D :D :D :D :D
Responder
  • Informação
  • Quem está online

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