Pergunta : Segurando exceções e agarrando mensagens de erro de Oracle

Olá! indivíduos,

Given um certificado abaixo:

ScriptName: InsRecOnMytable.sql
--------------------------------
ERR_MSG VARCHAR2 do



DECLARE (4000);
SCRT_NAME VARCHAR2 (400): = “InsRecOnMytable.sql”; inserção do


BEGIN

em valores do
de myschema.mytable (ESQUEMA, NOME, OBSERVAÇÃO, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETÁRIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) (tabela 1 do “myschema”, a “mytable”, da “amostra”, “TABELA”, “BASIC”, “PRODUCT”, “PRODUCT”, 0, “Sample 1”, zero); inserção do

em valores do
de myschema.mytable (ESQUEMA, NOME, OBSERVAÇÃO, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETÁRIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) (tabela 2 do “myschema”, a “mytable”, da “amostra”, “TABELA”, “BASIC1”, “PRODUCT1”, “PRODUCT1”, 1, “Sample 2”, zero); o

comete;
GrabErr do
(SCRT_NAME, “sucesso ");

END SE;

EXCEPTION
QUANDO DUP_VAL_ON_INDEX ENTÃO  -- os registros da duplicata dos punhos o
do error
que seleciona os msg duplicado da inserção em ERR_MSG de duplo;

GrabErr (SCRT_NAME, ERR_MSG); -- um procedimento que tomar o ERR_MSG como o
do parameter
QUANDO OUTRO ENTÃO  -- segura todos msg do errors
resultou do above> duplicado da inserção em ERR_MSG de duplo;

GrabErr (SCRT_NAME, ERR_MSG); -- um procedimento que tome o ERR_MSG como o ROLLBACK do
do parameter
;
END; a necessidade do
/

I apenas uma maneira de poder passar ou armazenar using uma variável a mensagem de erro real de ORACLE resultou do registro da duplicata acima e mais importante, a linha número onde o erro ocorreu para o certificado da eliminação de erros purposes.

the acima é uma idéia somente. Sentir que livre sugerir o que quer que é a melhor solução através da lima de REGISTRO de PL/SQL.

Using trabalhará mas a idéia aqui é que o procedimento de GrabErr atualizará algumas colunas em uma tabela diz SCRIPTINFO que contem os detalhes para cada certificado que está sendo executado. Se há uma maneira de criar a lima de REGISTRO e ao mesmo tempo de estar destilador capaz para atualizar a tabela de SCRIPTINFO, então tanto better.


qualquer outra coisa semelhante:
--------------------


SCRIPTINFO TABLE
----------------o oracle
ID EXEC_STATUS REMARKS
===========================================================================
1 erra msg.>
2 MyScriptInsert.sql Success
===========================================================================


Can que qualquer outra coisa semelhante seja feito?

Thanks adiantado,
jrmn
class= do

Resposta : Segurando exceções e agarrando mensagens de erro de Oracle

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ê.
Outras soluções  
 
programming4us programming4us