Parfois, j'obtiendrai un script qui fonctionnera correctement dans SQL Developer ou Toad, mais qui nécessite une modification pour être exécuté avec succès à partir de SQL * Plus. Voici le pire exemple contenant plusieurs instructions, chacune avec des lignes vides, des points-virgules et des barres obliques:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
Pour diverses raisons, ces instructions doivent être exécutées à partir de SQL * Plus. Les lignes blanches sont faciles à résoudre avec un simple ...
set sqlblanklines on
Je suis conscient que le sqlterminator
peut être modifié et / ou désactivé, mais les deux nécessiteraient des modifications du code, le premier déplace le problème sans le résoudre et aucun ne résout le problème de la barre oblique intégrée.
La meilleure réponse serait de permettre à ces instructions de s'exécuter sans modification en modifiant l'environnement d'une manière ou d'une autre (comme le fait sqlblanklines). Si cela n'est pas possible, il existe peut-être un moyen de modifier par programme les scripts. J'essaie d'éviter les changements manuels.
la source
Réponses:
Vous pouvez faire la plupart de cela en utilisant un login.sql. login.sql est exécuté lors de la connexion - surprenante - et est chargé à partir de votre répertoire SQLPATH ou actuel. Pour les exemples que vous avez donnés, vous avez vraiment choisi le pire des cas.
Le problème est le sqlterminator. Quoi que vous y mettiez, la barre oblique est conservée comme un sqlterminator gratuit. À côté de cela, sqlplus recherche d'abord le sqlterminator et le fait avant de numériser vers le terminateur de chaîne. Un bug si vous me demandez. La barre oblique peut être utilisée dans une chaîne tant qu'elle n'est pas seule sur une ligne séparée. Dès que sqlplus trouve le caractère spécifié comme sqlterminator, il ignore tout le reste et arrête la lecture.
La barre oblique peut être gérée, tant qu'elle n'est pas seule sur une ligne.
login.sql contient:
leigh.sql contient:
exécutez le script:
Pas besoin de jouer avec les blocs de début / fin. Impossible de gérer sqlterminator à l'intérieur de la commande, peu importe où il se trouve, dans une chaîne ou non, ne peut pas gérer les lignes avec barre oblique seule sur une ligne dans une chaîne.
la source
Les instructions d'insertion avec des lignes vides et des points-virgules réussiront si elles sont placées à l'intérieur des blocs BEGIN ... END. Cette modification pourrait être effectuée à l'aide d'un script, mais le script échouerait s'il contenait des instructions DDL qui ne peuvent pas être exécutées à l'intérieur d'un bloc sans exécution immédiate.
Cette solution ne résout pas non plus le problème intégré /.
la source
Ma solution:
Il semble que le terminateur de commande soit ignoré dans l'instruction body.
la source
la source