2010-08-06 29 views
5

He estado tratando de resolver esto por un tiempo y creo que es hora de pedir ayuda. Estoy construyendo una secuencia de comandos de suministro de esquemas y quiero agregar algunas secuencias de comandos de salida y manejo de errores. La idea es que la ventana de salida del script solo me muestre los mensajes clave sin todo el ruido.Error al manejar en una secuencia de comandos de Oracle

Create Temporary Error Table 
Begin Transaction 

-- begin work block 
Print "Doing some types of work" 
-- do work here 

If Error and Active Transactions > 0 Then Rollback 
If Active Transactions = 0 Then Insert Error In Temp Error Table and Start Another Transaction 
-- end work block 

-- once all all work complete 
If Active Transactions > 0 Then Commit Transactions 

En el mundo de SQL Server que podría tan sólo hacer esto con Red Gate's SQL Packager, que ha descubierto que (pista, pista Red Gate - necesitamos una versión de Oracle :)). ¿Alguna idea de dónde comenzar con Oracle para obtener algo similar?

+2

_Estoy creando un script de aprovisionamiento de esquema_ Si quiere decir que está creando/alterando tablas y cosas así; la reversión no ayudará. Dentro de Oracle, un comando DDL confirma que la transacción actual, si hay una pendiente, se ejecuta dentro de una transacción y se compromete con éxito, recupera la falla. Por lo tanto, después de ejecutar un comando DDL no habrá ninguna transacción pendiente.La única excepción es si hay un error de análisis, entonces el DB no sabe que se suponía que debía ejecutar un comando DDL, y no haría el primer compromiso implícito, ni iniciaría una transacción para el DDL. Esto es muy diferente de SQL Server. –

+0

Mi comentario no proporciona una respuesta, solo está ahí para señalar una trampa de la que usted puede o no haber tenido conocimiento. –

+0

@Shannon - Gracias, realmente apesta que no se pueda hacer una transacción de alcance más amplio que incluya DDL. Realmente hace que el manejo de errores sea mucho más difícil en el proceso de aprovisionamiento al dejar la base de datos en un estado medio vacío si algo sale mal. –

Respuesta

2

En Oracle, se definen los límites de la transacción - comprometerse cuando haya terminado, y cada declaración es atómica.

Si está utilizando SQL * Plus y que no quieren nada en absoluto para cometer si algo va mal, puede no poner el siguiente en la secuencia de comandos SQL:

SET ECHO ON 
SPOOL /some/path/to/logfile.log 
WHENEVER SQLERROR EXIT SQL.CODE ROLLBACK 

-- run your code or DML statements 

COMMIT; 
EXIT; 

Este bombardeen a cabo la primera vez que encuentra un error, por lo que la declaración de error estará al final del archivo de registro. También revertirá cualquier cambio, por lo tanto, siempre que no haya ningún COMMIT s (o declaraciones que los causen, como CREATE, ALTER, DROP, GRANT, o REVOKE), entonces la actualización completa es "todo o nada".

0

En la mayoría de los casos que he visto, tales tareas (repetitivas) se automatizan usando scripts.

Una forma de hacerlo actualmente es una secuencia de comandos de UNIX que ejecuta todos los archivos .sql en un directorio dado y genera un archivo .log. Al final del proceso, grepizamos el archivo de registro y vemos si hay algún error.

No necesitará imprimir ningún error manualmente, porque sqlplus ya imprime el error y se captura en el archivo de registro.

A continuación se muestra un ejemplo muy sencillo ...

archivo .ksh

#!/usr/bin/ksh 
echo "Starting provisioning script.." 

sqlplus scott/[email protected] > file1.log << ! 
@file1.sql 
@file1.sql 
! 

echo "end of provisioning script" 

y el contenido de file1.sql (que está en el mismo directorio para este ejemplo)

create table test123(
    id number, 
    name varchar2(200) 
); 

cuando ejecuto este script, el primero crea tener éxito y el segundo falla ... y el archivo de registro sería ... como ..

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 6 20:44:08 2010 

Copyright (c) 1982, 2007, Oracle. All Rights Reserved. 


Connected to: 
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

SQL> 
Table created. 

SQL> create table test123(
      * 
ERROR at line 1: 
ORA-00955: name is already used by an existing object 


SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

Puede preparar un script en esta línea ... y luego buscar cualquier error en el archivo de registro ... una vez que se complete la ejecución. Puede usar varios comandos de sesión sqlplus para deshacerse de todos los comentarios no deseados y demás.

No conozco ninguna herramienta automatizada que haga lo mismo. La razón por la que siempre he

Espero que esto ayude ...

+0

Estoy tratando de evitar mezclar scripts de shell si es posible. Crea demasiadas dependencias. –

Cuestiones relacionadas