Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #90852
    gil_assis
    Participante

      Senhores,

      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?

      #90854
      burga
      Participante

        Nunca 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.

        #90865
        gil_assis
        Participante

          Olá Burga,

          obrigado por responder.

          tem como passar esse trigger?

          agradeço mais uma vez.

          #90867
          burga
          Participante

            Oi 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

            #90877
            gil_assis
            Participante

              Olá Burga,

              vou tentar implementar aqui também.

              Muito Obrigado pela ajuda.

              Gil

              #90886
              MauroLacerda
              Participante

                Gil,

                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) violated

                O Conteudo completo esta em :
                http://download.oracle.com/docs/cd/E118 … s_9014.htm

                Abs

                #90935
                gil_assis
                Participante

                  Olá Mauro,

                  Obrigado por responder.
                  acho que valerá fazer o teste.

                  Agradeço mais uma vez.

                  Gil

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.