Nous avons eu un débat cette semaine dans mon entreprise sur la façon dont nous devrions écrire nos scripts SQL.
Contexte: Notre base de données est Oracle 10g (mise à niveau vers 11 bientôt). Notre équipe DBA utilise SQLPlus pour déployer nos scripts en production.
Maintenant, nous avons eu un déploiement récemment qui a échoué car il avait utilisé à la fois un point-virgule et une barre oblique ( /
). Le point-virgule se trouvait à la fin de chaque instruction et la barre oblique entre les instructions.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Certains déclencheurs ont été ajoutés plus tard dans le script, certaines vues ont été créées ainsi que certaines procédures stockées. Le fait d'avoir à la fois le ;
et le /
fait que chaque instruction s'exécute deux fois, ce qui provoque des erreurs (en particulier sur les insertions, qui doivent être uniques).
Dans SQL Developer, cela ne se produit pas, dans TOAD, cela ne se produit pas. Si vous exécutez certaines commandes, elles ne fonctionneront pas sans /
elles.
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, vous devez donc utiliser la barre oblique.
Ma question est donc 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, devez-vous toujours utiliser le /
?
sqlterminator
à!
si vous le souhaitez) et cette convention a tendance à suivre par d' autres outils. Le langage PL / SQL utilise cependant des points-virgules comme élément de syntaxe obligatoire.Réponses:
C'est une question de préférence, mais je préfère voir des scripts qui utilisent systématiquement la barre oblique - de cette façon, toutes les «unités» de travail (création d'un objet PL / SQL, exécution d'un bloc anonyme PL / SQL et exécution d'une instruction DML) peuvent être repéré plus facilement à l'œil nu.
De plus, si vous passez finalement à quelque chose comme Ant pour le déploiement, cela simplifiera la définition des cibles pour avoir un délimiteur d'instructions cohérent.
la source
/
ou ne;
voyez pas la réponse de @a_horse_with_no_name ou @Mr_Moneybags pour plus de contexteJe sais que c'est un vieux fil, mais je suis juste tombé dessus et je pense que cela n'a pas été complètement expliqué.
Il existe une énorme différence dans SQL * Plus entre la signification de a
/
et a;
car ils fonctionnent différemment.Le
;
termine une instruction SQL, tandis que le/
exécute tout ce qui se trouve dans le "tampon" actuel. Ainsi, lorsque vous utilisez a;
et a,/
l'instruction est en fait exécutée deux fois.Vous pouvez facilement voir cela en utilisant un
/
après l'exécution d'une instruction:Dans ce cas, on remarque réellement l'erreur.
Mais en supposant qu'il existe un script SQL comme celui-ci:
Et ceci est exécuté à partir de SQL * Plus, alors ce sera très déroutant:
Le
/
est principalement nécessaire pour exécuter des instructions intégrées;
comme uneCREATE PROCEDURE
instruction.la source
;
), vous devez trouver un moyen de spécifier un autre délimiteurJe voulais clarifier un peu plus l'utilisation entre le
;
et le/
Dans SQLPLUS:
;
signifie "terminer l'instruction courante, l'exécuter et la stocker dans la mémoire tampon SQLPLUS"<newline>
après une instruction DML (SELECT, UPDATE, INSERT, ...) ou certains types d'instructions DDL (création de tables et vues) (qui ne contiennent aucun;
), cela signifie, stocker l'instruction dans le tampon mais ne pas l'exécuter./
après avoir entré une instruction dans le tampon (avec un blanc<newline>
) signifie «exécuter le DML ou DDL ou PL / SQL dans le tampon.RUN
ouR
est une commande sqlsplus pour afficher / sortir le SQL dans le tampon et l'exécuter. Cela ne mettra pas fin à une instruction SQL./
lors de la saisie d'un DML ou DDL ou PL / SQL signifie "terminer l'instruction en cours, l'exécuter et la stocker dans le tampon SQLPLUS"REMARQUE: car ils
;
sont utilisés pour PL / SQL pour terminer une instruction;
ne peuvent pas être utilisés par SQLPLUS pour signifier «terminer l'instruction en cours, l'exécuter et la stocker dans la mémoire tampon SQLPLUS» car nous voulons que tout le bloc PL / SQL soit complètement dans le tampon, puis exécutez-le. Les blocs PL / SQL doivent se terminer par:la source
Presque tous les déploiements Oracle sont effectués via SQL * Plus (ce petit outil de ligne de commande étrange que votre DBA utilise). Et dans SQL * Plus, une seule barre oblique signifie essentiellement "réexécuter la dernière commande SQL ou PL / SQL que je viens d'exécuter".
Voir
La règle d'or serait d'utiliser une barre oblique avec des choses qui font
BEGIN .. END
ou où vous pouvez utiliserCREATE OR REPLACE
.Pour les inserts qui doivent être à usage unique
la source
D'après ce que je comprends, toutes les instructions SQL n'ont pas besoin de barre oblique car elles s'exécuteront automatiquement à la fin des points-virgules, y compris les instructions DDL, DML, DCL et TCL.
Pour les autres blocs PL / SQL, y compris les procédures, les fonctions, les packages et les déclencheurs, car ce sont des programmes à plusieurs lignes, Oracle a besoin d'un moyen de savoir quand exécuter le bloc, nous devons donc écrire une barre oblique à la fin de chaque bloc pour laissez Oracle l'exécuter.
la source
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 barre oblique.
la source