- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 4 meses atrás por
gil_assis.
-
AutorPosts
-
11 de novembro de 2009 às 8:38 pm #90852
gil_assis
ParticipanteSenhores,
existem alguma forma de registrar apenas os erros no SPOOL ao executar uma série de comandos a partir de um script.
Exemplo: o script insere_dados.sql com 2.000 comandos (insert’s) ao executá-lo (@insere_dados.sql), gostaria de registrar (spool resultado.log) no log, ou algum outro lugar, apenas as linhas que deram erros.
o script tem esse formato:
insert into tabela_a values (‘valor1’, valor2, ‘valor3’);
insert into tabela_a values (‘valor4’, valor5, ‘valor6’);e assim por diante….
é possível registrar apenas os comandos com erros?
11 de novembro de 2009 às 11:40 pm #90854burga
ParticipanteNunca precisei capturar somente as exceções geradas por um script com o spool então eu desconheço uma maneira de fazer por este caminho.
O que você pode fazer, que eu já fiz, é construir uma trigger que é ativada no evento SERVERERROR e logar o SQL aplicado e a mensagem de exceção em alguma tabela ou arquivo… Deve ter um meio mais fácil de se conseguir isto, porém foi o que melhor serviu pro meu caso.
12 de novembro de 2009 às 5:14 pm #90865gil_assis
ParticipanteOlá Burga,
obrigado por responder.
tem como passar esse trigger?
agradeço mais uma vez.
12 de novembro de 2009 às 5:37 pm #90867burga
ParticipanteOi Gil,
Segue o código que utilizo, fiz algumas modificações pra que possa atender melhor o seu caso.
Tabela:
CREATE TABLE "ERROR_LOG"
( "TIMESTAMP" DATE,
"ERROR_STACK" VARCHAR2(2000 BYTE),
"OWNER" VARCHAR2(30 BYTE),
"SQL" VARCHAR2(4000 BYTE)
);Trigger:
create or replace TRIGGER TG_CAPTURA_EXCECAO_01
AFTER SERVERERROR
ON DATABASE
DECLARE
v_stmt CLOB;
n NUMBER;
sql_text ora_name_list_t;BEGIN
n := ora_sql_txt(sql_text); FOR i IN 1..n LOOP v_stmt := v_stmt || sql_text(i); END LOOP;INSERT INTO error_log
VALUES (SYSDATE, DBMS_UTILITY.FORMAT_ERROR_STACK, ora_dict_obj_owner, v_stmt);
END TG_CAPTURA_EXCECAO_01;Essa trigger vai ser acionada sempre que ocorrer algum erro ORA no banco de dados (com exceção de alguns). Você ainda pode diminuir o escopo da trigger alterando a cláusula ON DATABASE pra ON nome_do_esquema.SCHEMA, e executar os comandos com o mesmo usuário do esquema informado.
Segue um link pra entender melhor.
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm
12 de novembro de 2009 às 10:49 pm #90877gil_assis
ParticipanteOlá Burga,
vou tentar implementar aqui também.
Muito Obrigado pela ajuda.
Gil
13 de novembro de 2009 às 12:51 am #90886MauroLacerda
ParticipanteGil,
Achei uma dica interessante:
CREATE TABLE raises (emp_id NUMBER, sal NUMBER
CONSTRAINT check_sal CHECK(sal > 8000));EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG(‘raises’, ‘errlog’);
INSERT INTO raises
SELECT employee_id, salary*1.1 FROM employees
WHERE commission_pct > .2
LOG ERRORS INTO errlog (‘my_bad’) REJECT LIMIT 10;SELECT ORA_ERR_MESG$, ORA_ERR_TAG$, emp_id, sal FROM errlog;
ORA_ERR_MESG$ ORA_ERR_TAG$ EMP_ID SAL
ORA-02290: check constraint my_bad 161 7700
(HR.SYS_C004266) violatedO Conteudo completo esta em :
http://download.oracle.com/docs/cd/E118 … s_9014.htmAbs
17 de novembro de 2009 às 3:34 pm #90935gil_assis
ParticipanteOlá Mauro,
Obrigado por responder.
acho que valerá fazer o teste.Agradeço mais uma vez.
Gil
-
AutorPosts
- Você deve fazer login para responder a este tópico.