Seu código é APROVADO, mas eu recomendaria algumas mudanças: Não há nenhuma necessidade de fazer isto: selecionar em ERR_MSG de duplo; O erro está nestas variáveis: SQLCODE e SQLERRM, assim
EXCEÇÃO QUANDO DUP_VAL_ON_INDEX ENTÃO -- a duplicata dos punhos grava o erro
GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM); ROLLBACK; -- Eu adicionei este porque em um procedimento GrabErr deve haver uma TRANSAÇÃO AUTÔNOMA
QUANDO OUTRO ENTÃO -- segura todos erros restantes GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM); ROLLBACK; EXTREMIDADE;
Na TRANSAÇÃO AUTÔNOMA do uso de GrabErr do procedimento. Você pode igualmente definir seus próprios erros da aplicação. Está aqui mais sobre a manipulação de exceção: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014
Se você quer saber a linha onde o erro ocorre então adicionar um n_debug da variável por exemplo:
DECLARAR SCRT_NAME VARCHAR2 (400): = “InsRecOnMytable.sql”; n_debug PLS_INTEGER: =0;
COMEÇAR n_debug: =1; Inserção em myschema.mytable (ESQUEMA, NOME, OBSERVAÇÃO, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETÁRIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) valores (o “myschema”, “mytable”, da “a tabela 1 amostra”, “TABELA”, “BASIC”, “PRODUTO”, “PRODUTO”, 0, “prova 1”, zero);
n_debug: =2;
Inserção em myschema.mytable (ESQUEMA, NOME, OBSERVAÇÃO, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETÁRIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) valores (o “myschema”, “mytable”, da “a tabela 2 amostra”, “TABELA”, “BASIC1”, “PRODUCT1”, “PRODUCT1”, 1, “prova 2”, zero);
n_debug: =3; cometer;
GrabErr (n_debug, SCRT_NAME, “sucesso ");
TERMINAR SE;
EXCEÇÃO GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM); ROLLBACK;
QUANDO OUTRO ENTÃO -- segura todos erros restantes GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM); ROLLBACK; EXTREMIDADE;
Eu faço-a esta maneira. Você pode igualmente criar um procedimento com o parâmetro SCRT_NAME da entrada e em vez do certificado você pode usar o procedimento.
Eu espero que esta será pouca ajuda para você.
|