Selecionar tudo
begin
select count(*) v_contador from tabela_A;
if nvl(v_contador,0) > 0 then
l_msg('Aguarde por favor, enquanto outro usuário realiza a impressão.');
raise form_trigger_failure;
end if;
exception
when l_msd(sqlerrm);
raise form_trigger_failure;
end;
Hahu,
Existe uma explicação muito lógica para o "Non-Oracle Exception", porém o seu código está meio estranho.
Da forma em que está, ele NUNCA será executado, pois há erros de sintaxe e lógica, que quem tentar executar logo perceberá. Então vamos ao que interessa:
A mensgame é clara:
"100501: non-Oracle exception"
Onde "100501" é o SQLCODE e "100501: non-Oracle exception" é o SQLERRM. O nome já diz tudo. Não é uma exceção do Oracle. Já é uma pista.
Para esta mensagem ser exibida, seria necessário um tratamento de erros com EXCEPTION, com WHEN OTHERS, onde o SQLERRM fosse exibido. Seu código não tem isto, então só se pode presumir que o código que está dando o erro não é este.
Supondo a condição que realmente um erro desse poderia ocorrer, do que se trata???
Da própria exceção FORM_TRIGGER_FAILURE, que não é uma exceção do Oracle, mas sim uma exceção da ferramente Forms Developer.
Para evitar situações deste tipo,
sempre que se queira tratar exceções com WHEN OTHERS dentro do Oracle Forms, deve-se presumir a utilização do FORM_TRIGGER_FAILURE para evitar surpresas desagradáveis como esta.
Eu vou reescrever seu código, com o tratamento adequado (além de fazer ajustes para que ele funcione).
Salientando que para o teu caso o FORM_TRIGGER_FAILURE seria desnecessario. Colocarei o tratamento dele supondo que isto seria uma rotina chamada de outros pontos do sistema que poderiam lançar o FORM_TRIGGER_FAILURE.
Segue abaixo:
Selecionar tudo
declare
e_aguardar_impressao exception;
begin
select count(*) into v_contador from tabela_A;
if nvl(v_contador,0) > 0 then
raise e_aguardar_impressao;
end if;
exception
-- aqui é o principal ponto de discussão
when form_trigger_failure then
raise; -- levanta a exceção novamente para que a trigger do forms pare.
when e_aguardar_impressao then
l_msg('Aguarde por favor, enquanto outro usuário realiza a impressão.');
when others then
l_msg(sqlerrm);
end;