Oracle
 sql >> Base de données >  >> RDS >> Oracle

Slash ou pas de slash ?

C'est la question.

Un article récent sur les forums OTN a posé des questions sur l'utilisation de points-virgules et de barres obliques comme terminateurs d'instruction. J'ai dépoussiéré un article que j'ai écrit pour notre équipe de développement il y a plus de 4 ans sur ce sujet. Cet article a reçu de bonnes critiques et est disponible sur les forums OTN si vous le souhaitez. J'ai pensé que je le posterais aussi sur mon blog. Voici l'article :

Slash ou pas de slash

par Brian Peasland

Dans notre entreprise, les scripts SQL qui sont déployés sont exécutés dans l'utilitaire de ligne de commande SQL*Plus d'Oracle, alors que de nombreux développeurs utilisent un outil GUI comme PL/SQL Developer ou SQL Developer. La barre oblique signifie quelque chose pour SQL*Plus qui n'est pas nécessaire dans PL/SQL Developer ou SQL Developer. En tant que tel, il peut être déroutant de savoir si vous devez inclure ou non une barre oblique dans vos scripts SQL. Espérons que cette section éclairera ce que fait la barre oblique, quand l'utiliser et quand ne pas l'utiliser. Point-virgule Terminator Pour la plupart des instructions SQL, le point-virgule est le terminateur de l'instruction. Par exemple, considérez cette instruction SQL simple exécutée dans SQL*Plus :

SQL> sélectionnez la date système à partir du double ;

DATESYS

———

18-JUN-12

Lorsque SQL*Plus voit le point-virgule, il sait que la fin de l'instruction SQL a été atteinte et il peut maintenant exécuter la commande.

Tampon SQL*Plus

Vous ne savez peut-être pas que SQL*Plus dispose d'un tampon pour ses commandes. Si j'appuie sur la touche "l" pour "liste", je peux voir la commande actuellement dans le tampon de ma session.

SQL> l

1* sélectionner la date système à partir du double

Sans surprise, il y a la commande que je viens d'exécuter. J'ai ensuite exécuté une autre instruction SQL et voici à quoi ressemble mon tampon :

SQL> l

1 sélectionnez date système, utilisateur

2* de double

Comme vous pouvez le voir, j'ai maintenant deux lignes dans le tampon SQL*Plus de ma session.

Barre oblique =exécuter le tampon

La première règle à comprendre à propos de la barre oblique est que pour SQL*Plus, la barre oblique signifie exécuter le contenu du tampon. Pour illustrer ce concept, je vais exécuter une instruction SQL, attendre quelques secondes, puis exécuter à nouveau cette même instruction SQL, mais en exécutant simplement le tampon.

SQL> sélectionnez to_char(sysdate,'MM/DD/YYYY HH24:MI:SS') from dual ;

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:20:40

SQL> /
TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:21:17

SQL> /

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:21:50

Vous pouvez voir que tout ce que j'ai fait la deuxième et la troisième fois a été de taper "/" et d'appuyer sur Entrée et SQL*Plus a exécuté le contenu de son tampon de commandes à chaque fois.

Blocs PL/SQL

Le terminateur d'instruction en point-virgule fonctionnait très bien par lui-même jusqu'à ce qu'Oracle introduise PL/SQL dans Oracle version 7. Le problème est que les blocs PL/SQL peuvent avoir plusieurs points-virgules pour terminer les instructions individuelles qui composent ce bloc. Considérez ce bloc PL/SQL très simple qui ne fait rien :

SQL> commencer

2 nul ;

3 nul ;

4 fin ;

5

Les lignes 2 et 3 contiennent des instructions parfaitement valides qui se terminent chacune par un point-virgule. Et à la ligne 4, nous avons le mot-clé END signifiant la fin du bloc PL/SQL. Si nous n'étions pas autorisés à emboîter les paires BEGIN/END, alors chaque fois que SQL*Plus verra « END ; » il saura que la fin du bloc PL/SQL a été atteinte, mais nous sommes autorisés à emboîter les paires BEGIN/END, donc ce qui suit est parfaitement légal et valide :

SQL> commencer

2 commencer

3 nul ;

4 fin ;

5 nul ;

6 fin ;

7

Vous pouvez dire d'après ce qui précède que la simple recherche de "END ;" n'est pas suffisant car SQL*Plus aurait tenté d'exécuter le bloc après la ligne 4. Alors, comment Oracle a-t-il décidé de signifier que le bloc PL/SQL était prêt à s'exécuter ? La réponse est en utilisant la barre oblique comme vous le savez peut-être déjà. La deuxième règle à comprendre est que tout ce que fait la barre oblique lorsque vous l'utilisez pour terminer un bloc PL/SQL est de dire à SQL*Plus d'exécuter ce qui se trouve dans le tampon ! Cela n'a pas changé depuis la création de PL/SQL pour Oracle 7. Considérez l'exemple suivant :

SQL> commencer

2 nul ;

3 fin ;

4 /

Procédure PL/SQL terminée avec succès.

SQL> l

1 début
2 null ;

3* fin ;

À la ligne 4, j'ai tapé la barre oblique pour exécuter le bloc PL/SQL. Vous pouvez voir que mon bloc s'est terminé avec succès. Si nous revenons en arrière et regardons le contenu de mon tampon de commandes, vous pouvez voir qu'il contient tout sauf la barre oblique. La barre oblique ne fait pas partie du tampon de commande. Alors maintenant, je vais exécuter un bloc PL/SQL différent :

SQL> commencer

2 dbms_output.put_line(‘Aujourd’hui c’est ‘||to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’));

3 fin ;

4 /

Aujourd'hui est le 18/06/2012 15:39:32

Procédure PL/SQL terminée avec succès.

La barre oblique indique à SQL*Plus d'exécuter ce qui se trouve dans son tampon, et les résultats sont affichés. Maintenant, tapons à nouveau juste la barre oblique et nous devrions voir notre bloc PL/SQL s'exécuter à nouveau.

SQL> /

Aujourd'hui est le 18/06/2012 15:40:42

Procédure PL/SQL terminée avec succès.

Je n'ai pas eu à retaper mon bloc PL/SQL car il se trouve actuellement dans le tampon de commande.

Développeur PL/SQL et SQL et blocs PL/SQL

Le plus gros problème pour la plupart des développeurs est que PL/SQL Developer et SQL Developer ne vous obligent pas à utiliser la barre oblique. Pourquoi? Parce que vous pouvez appuyer sur Exécuter (F8) ou Exécuter le script (F5) pour exécuter votre bloc PL/SQL. Le développeur PL/SQL sait qu'au moment où vous appuyez sur F8, vous avez l'intention de soumettre le bloc PL/SQL à exécuter. Dans ce cas, F8 dans PL/SQL Developer fait le même travail que la barre oblique dans SQL*Plus. De même, pour F5 dans SQL Developer.

Le problème dans mon entreprise est que notre équipe qui déploie du code en production ne déploie pas de code avec PL/SQL Developer ou SQL Developer. Ils utilisent SQL*Plus car il est plus facile de créer des scripts pour plusieurs exécutions avec un outil de ligne de commande. De nombreux développeurs font l'erreur de ne pas inclure la barre oblique pour les blocs PL/SQL dans les scripts car ils n'en ont pas besoin, mais si vous souhaitez déployer cette section de code dans un script SQL, la barre oblique est requise à la fin de chaque PL /Bloc SQL.

Quand ne pas utiliser le slash

Nous avons donc vu quand et pourquoi nous utilisons la barre oblique, mais quand est-ce mauvais de l'utiliser ? La troisième règle à connaître est qu'il est déconseillé d'utiliser la barre oblique après une seule instruction SQL (pas dans un bloc PL/SQL), en particulier lorsque cette barre oblique suit immédiatement une instruction DML (INSERT, UPDATE ou DELETE). Si mon script contient les éléments suivants :

sélectionnez la date système à partir du double ;

/

Ensuite, j'obtiendrai une "double sortie", ce qui n'est pas ce que j'ai normalement l'intention de faire dans un script. Je veux vraiment qu'une seule ligne soit renvoyée, pas deux comme le ferait le script ci-dessus :

SQL> sélectionnez la date système à partir du double ;

DATESYS

———

18-JUN-12
SQL> /

DATESYS

———

18-JUN-12

C'est encore pire lorsque j'utilise la barre oblique après une instruction DML car cette instruction sera exécutée deux fois. Considérez le script suivant :

insérer dans les valeurs test_tab (10);

/

Nous savons maintenant que lorsque j'exécute les deux lignes ci-dessus dans un script, SQL*Plus l'exécute une fois en raison du caractère de fin d'instruction en point-virgule, puis s'exécute une deuxième fois car la barre oblique indique à SQL*Plus d'exécuter ce qui se trouve dans le tampon de commande. Lorsque j'exécute le script de deux lignes ci-dessus, j'obtiens le résultat suivant :

SQL> insérer dans les valeurs de test_tab (10);

1 ligne créée.

SQL>

/

insérer dans les valeurs de test_tab (10) *

ERREUR à la ligne 1 :ORA-00001 : contrainte unique (PEASLAND.SYS_C00767176) violée

Oups! La première insertion a fonctionné (1 ligne créée.) mais lorsque la barre oblique a été saisie, SQL*Plus a essayé d'insérer les mêmes données et j'ai été pris en flagrant délit de violation de contrainte unique.

Conclusion

Espérons que cette page montre pourquoi la barre oblique est nécessaire, ce qu'elle fait et quand ne pas l'utiliser. Pour récapituler :

  • Inclure la barre oblique à la fin de chaque bloc PL/SQL
  • N'incluez pas de barre oblique après les instructions SQL qui ne se trouvent pas dans un bloc PL/SQL.
  • La barre oblique après une seule instruction SQL entraînera l'exécution de cette commande SQL deux fois.