2010-08-06 4 views
5

J'ai essayé de comprendre cela depuis un petit moment maintenant et je pense qu'il est temps de demander de l'aide .. Je construis un script de provisioning de schéma et je veux ajouter une sortie de script et la gestion des erreurs. L'idée est que la fenêtre de sortie du script ne me montrerait que les messages clés sans tout le bruit.Traitement des erreurs dans un script 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 

Dans le monde SQL Server je normalement faire juste cela avec Red Gate's SQL Packager qui a ce compris (indice, indice Red Gate - nous avons besoin d'une version Oracle :)). Des idées sur où commencer avec Oracle pour obtenir quelque chose de similaire?

+2

_Je construis un script de provisioning de schéma_ Si vous voulez dire que vous créez/modifiez des tables et autres; La restauration ne va pas aider. Dans Oracle, une commande DDL valide la transaction en cours, si elle est en attente, s'exécute elle-même dans une transaction, et valide en cas de succès, se rétablit en cas d'échec. Ainsi, après avoir exécuté une commande DDL, il n'y aura pas de transaction en attente.La seule exception étant s'il y a une erreur d'analyse, la base de données ne sait pas qu'elle était supposée exécuter une commande DDL et ne fera pas la première validation implicite, ni ne commencera une transaction pour la DDL. Ceci est très différent de SQL Server. –

+0

Mon commentaire ne fournit pas de réponse, il est seulement là pour signaler un piège que vous pourriez ou ne pas avoir été au courant. –

+0

@Shannon - Merci, ça craint vraiment que vous ne pouvez pas faire une transaction étendue qui inclut DDL. Cela rend la gestion des erreurs beaucoup plus difficile dans le processus d'approvisionnement en laissant la base de données dans un état à moitié cuit si quelque chose ne va pas. –

Répondre

2

Dans Oracle, vous définissez les limites de transaction - vous vous engagez lorsque vous avez terminé, et chaque instruction est atomique.

Si vous utilisez SQL * Plus et vous ne voulez pas quoi que ce soit pour commettre si quelque chose va mal, vous pouvez faire mettre ce qui suit dans le script SQL:

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

-- run your code or DML statements 

COMMIT; 
EXIT; 

Cela bombarder la première fois qu'il rencontre une erreur, l'instruction d'erreur sera à la fin du fichier journal. Il annulera également toutes les modifications, aussi longtemps qu'il n'y a aucun COMMIT s (ou les instructions qui les provoquent, comme CREATE, ALTER, DROP, GRANT, ou REVOKE), alors la mise à niveau complète est tout ou rien.

0

Dans la plupart des cas que j'ai vus, de telles tâches (répétitives) sont automatisées en utilisant des scripts.

Une façon dont nous le faisons actuellement est un script UNIX qui exécute tous les fichiers .sql dans un répertoire donné et génère un fichier .log. À la fin du processus, nous grep le fichier journal et voir s'il y a des erreurs.

Vous n'avez pas besoin d'imprimer les erreurs manuellement, car sqlplus imprime déjà l'erreur et elle est capturée dans le fichier journal.

Ci-dessous un exemple très simple ...

fichier .ksh

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

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

echo "end of provisioning script" 

Et le contenu de file1.sql (ce qui est dans le même répertoire pour cet exemple)

Lorsque j'exécute ce script, la première création réussit et la deuxième échoue .. et le fichier journal est .. comme
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 

Vous pouvez préparer un script le long de ces lignes ... puis rechercher les éventuelles erreurs dans le fichier journal .. une fois l'exécution terminée. Vous pouvez utiliser diverses commandes de session sqlplus pour vous débarrasser de tous les commentaires indésirables et autres.

Je ne suis pas au courant d'outils automatisés qui font la même chose. La raison pour laquelle je l'ai toujours

Hope this helps ...

+0

J'essaie de ne pas mélanger des scripts shell si possible. Crée trop de dépendances –

Questions connexes