Quand dois-je utiliser un point-virgule Par rapport à une barre oblique dans Oracle SQL?
nous avons eu quelques discussions cette semaine à mon entreprise sur la façon dont nous devrions écrire nos scripts SQL.
arrière-plan: Notre base de données est Oracle 10g (mise à niveau à 11 bientôt). Notre équipe DBA utilise SQLPlus pour déployer nos scripts en production.
nous avons eu récemment un déploiement qui a échoué parce qu'il avait utilisé à la fois un point-virgule et une barre oblique ( /
). Le point-virgule était à la fin de chaque déclaration et la barre oblique était entre déclaration.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
il y avait quelques déclencheurs ajoutés plus tard dans le script, quelques vues créées ainsi que quelques procédures stockées. Le fait d'avoir à la fois le ;
et le /
a fait tourner chaque instruction deux fois, causant des erreurs (en particulier sur les inserts, qui devaient être uniques).
dans SQL Developer cela n'arrive pas, dans TOAD cela n'arrive pas. Si vous exécutez certaines commandes, elles ne fonctionneront pas sans le /
dans leur.
en PL / SQL si vous avez un sous-programme (DECLARE, BEGIN, END) le point-virgule Utilisé sera considéré comme faisant partie du sous-programme, donc vous devez utiliser la barre oblique.
alors ma question Est la suivante: si votre base de données est Oracle, Quelle est la bonne façon d'écrire votre script SQL? Puisque vous savez que votre base de données est Oracle, devriez-vous toujours utiliser le /
?
6 réponses
c'est une question de préférence, mais je préfère voir des scripts qui utilisent régulièrement le slash - de cette façon toutes les" unités " de travail (création D'un objet PL/SQL, exécution D'un bloc PL/SQL anonymous, et exécution d'une instruction DML) peuvent être sélectionnées plus facilement par eye.
aussi, si vous passez éventuellement à quelque chose comme Ant pour le déploiement, cela simplifiera la définition des cibles pour avoir un délimiteur d'énoncé cohérent.
je sais que c'est un vieux fil, mais je viens de tomber dessus et je sens que cela n'a pas été expliqué complètement.
il y a une énorme différence en SQL*Plus entre la signification d'un /
et un ;
parce qu'ils fonctionnent différemment.
le ;
termine une instruction SQL, tandis que le /
exécute tout ce qui est dans le "buffer" courant. Ainsi, lorsque vous utilisez un ;
et un /
la déclaration est en fait exécutée deux fois.
, Vous peut facilement voir que l'utilisation d'un /
après l'exécution d'une instruction:
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options
SQL> drop table foo;
Table dropped.
SQL> /
drop table foo
*
ERROR at line 1:
ORA-00942: table or view does not exist
Dans ce cas on remarque effectivement l'erreur.
Mais en supposant qu'il y ait un script SQL comme ceci:
drop table foo;
/
et ceci est exécuté à partir de SQL*Plus alors ce sera très confus:
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options
SQL> @drop
Table dropped.
drop table foo
*
ERROR at line 1:
ORA-00942: table or view does not exist
le /
est principalement nécessaire pour exécuter des déclarations qui ont intégré ;
comme un CREATE PROCEDURE
.
je voulais clarifier un peu plus d'utilisation entre le ;
et le /
en SQLPLUS:
-
;
signifie "terminer l'instruction courante, l'exécuter et la stocker dans le tampon SQLPLUS" -
<newline>
after a D. M. L. (SELECT, UPDATE, INSERT,...) l'état ou de certains types de D. D. L (Création de Tables et de Vues) états (qui ne contiennent pas de;
), cela signifie, magasin de la déclaration au tampon mais ne l'exécute pas. -
/
après avoir entré une déclaration dans le tampon (avec un blanc<newline>
) signifie " exécuter le D. M. L. ou D. L. ou PL/SQL dans le tampon. -
RUN
ouR
est un sqlsplus commande pour afficher/sortie le SQL dans la mémoire tampon et de l'exécuter. Il ne terminera pas une instruction SQL. -
/
pendant l'entrée d'un D. M. L. ou D. D. L. Ou PL / SQL signifie " mettre fin à la instruction en cours, de l'exécuter et de le stocker dans le SQLPLUS tampon"
NOTE: parce que ;
sont utilisés pour PL/SQL pour terminer une instruction ;
ne peut pas être utilisé par SQLPLUS pour signifier "terminer l'instruction courante, l'exécuter et le stocker dans le tampon SQLPLUS" parce que nous voulons que L'ensemble du bloc PL/SQL soit complètement dans le tampon, puis l'exécuter. Les blocs PL / SQL doivent se terminer par:
END;
/
presque tous les déploiements Oracle se font via SQL*Plus (cet outil étrange en ligne de commande que votre DBA utilise). Et dans SQL*Plus une barre oblique isolée signifie essentiellement "ré-exécuter la dernière commande SQL ou PL/SQL que je viens d'exécuter".
voir
règle empirique serait d'utiliser slash avec des choses qui font BEGIN .. END
ou où vous pouvez utiliser CREATE OR REPLACE
.
pour les inserts qui doivent être d'usage unique
INSERT INTO my_table ()
SELECT <values to be inserted>
FROM dual
WHERE NOT EXISTS (SELECT
FROM my_table
WHERE <identify data that you are trying to insert>)
d'après ce que j'ai compris, toutes les instructions SQL n'ont pas besoin de slash avant car elles seront exécutées automatiquement à la fin des points-virgule, y compris les instructions DDL, DML, DCL et TCL.
pour les autres blocs PL/SQL, y compris les procédures, les fonctions, les paquets et les Triggers, car ce sont des programmes de plusieurs lignes, Oracle a besoin d'un moyen de savoir quand exécuter le bloc, donc nous devons écrire une barre oblique avant à la fin de chaque bloc pour laisser Oracle l'exécuter.
Je n'utilise la barre oblique qu'une seule fois à la fin de chaque script, pour dire à sqlplus qu'il n'y a plus de lignes de code. Au milieu d'un script, Je n'utilise pas de slash.