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 / ?

147
demandé sur a_horse_with_no_name 2009-07-03 19:57:50

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.

28
répondu dpbradley 2009-07-03 17:12:25

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 .

278
répondu a_horse_with_no_name 2012-04-18 10:40:08

je voulais clarifier un peu plus d'utilisation entre le ; et le /

en SQLPLUS:

  1. ; signifie "terminer l'instruction courante, l'exécuter et la stocker dans le tampon SQLPLUS"
  2. <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.
  3. / 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.
  4. RUN ou R 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.
  5. / 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;
/
66
répondu Mr_Moneybags 2014-01-15 18:57:38

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

http://ss64.com/ora/syntax-sqlplus.html

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>)
21
répondu jva 2015-11-09 03:06:21

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.

12
répondu Jerry 2015-11-09 03:06:48

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.

2
répondu Jonathan 2009-07-03 16:11:35