Quelle est la signification d'un point-virgule à la fin des commandes SQL * Plus?


16

Certaines instructions comme create table, insert into etc prennent un point-virgule à la fin:

CREATE TABLE employees_demo
    ( employee_id    NUMBER(6)
    , first_name     VARCHAR2(20)
    , last_name      VARCHAR2(25) 
         CONSTRAINT emp_last_name_nn_demo NOT NULL
    ) ;

tandis que d'autres aiment

set echo on
connect system/manager

passer aussi sans le point-virgule.

Quel est le raisonnement derrière cela? Comment puis-je décider moi-même où mettre le point-virgule et où pas?


6
+1 Pour rendre les choses plus confuses, vous pouvez utiliser / sur la ligne suivante au lieu de; dans certains cas.
bernd_k

Réponses:


15

Les commants de l'instance locale s'exécutent au retour. Les commandes multilignes au serveur s'exécutent sur le point-virgule

Les commandes spéciales décrites dans le manuel SQL * Plus sont les seules qui n'acceptent pas les points-virgules. Whereas Les commandes SQL doivent se terminer par un ;afin d'être analysées par le serveur.


Le point-virgule à la fin d'une commande est identique à une instruction GO à la fin d'une commande exécutée dans OSQL / SQLCMD dans Sql Server. C'est le signe que la commande sera analysée et exécutée.
Marian

7

Lorsque vous saisissez une instruction SQL dans SQL * Plus, elle doit savoir quand vous en avez terminé, en particulier si la commande s'étend sur plusieurs lignes. Par conséquent, il nécessite un caractère de caractère terminal qui peut être défini avec le set sqlterminator. Par défaut, ce caractère est le point-virgule:

SQL> select *
  2  from
  3  dual;

D
-
X

Maintenant, changer ce caractère terminal en un #:

SQL> set sqlterminator #
SQL> select *
  2  from
  3  dual#

D
-
X

L'instruction SQL s'est terminée (fin exécutée) par un #.

Vous demandez: pourquoi n'a set sqlterminator #pas été suivi d'un point-virgule? Répondez, car ce n'est pas une instruction SQL. Les instructions qui se rapportent à SQL * Plus et à son comportement, à la sortie, à la connexion asf (comme set echo onet connect system/manager) ne sont pas des instructions SQL et sont donc entrées sans le point-virgule.

Qu'est-ce que cela a à voir avec le /?

Lorsque vous avez entré une instruction SQL, SQL * plus a rempli ce qu'il appelle un tampon. Ce tampon peut être affiché avec la listcommande:

SQL> list
  1  select *
  2  from
  3* dual
SQL>

(Remarque: je n'ai entré que la liste , le reste est retourné)

L' /exécute maintenant ce qui est actuellement dans le tampon. Essayons cela:

SQL> /

D
-
X

Comme on peut le voir, la même requête est exécutée.


2

Le point-virgule est le point de séquence de l'analyseur SQL, tandis que les commandes qui sont exécutées dans SQL * Plus sont exécutées de toute façon immédiatement. Par analogie, comparez les points-virgules d'un programme C aux commandes entrées dans le shell.


0

D'après ce que je comprends, l'analyseur SQL général partage beaucoup de points communs avec l'analyseur JavaScript général, en ce sens qu'il souhaiterait un point-virgule après chaque endroit approprié, mais ce n'est pas obligatoire, sauf dans certaines circonstances. Quand on m'a appris à écrire SQL, on m'a dit qu'un point-virgule faisait partie du langage, pas un opérateur supplémentaire que nous pouvions ignorer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.