Qual è il significato di un punto e virgola alla fine dei comandi SQL * Plus?


16

Alcune istruzioni come create table, insert in etc prendono un punto e virgola alla fine:

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

mentre ad altri piace

set echo on
connect system/manager

passare anche senza il punto e virgola.

Qual è il ragionamento alla base di questo? Come posso decidere da solo dove mettere il punto e virgola e dove no?


6
+1 Per rendere le cose più confuse, puoi usare / sulla riga seguente invece di; in alcuni casi.
bernd_k,

Risposte:


15

I comandi all'istanza locale vengono eseguiti al ritorno. I comandi multilinea al server vengono eseguiti al punto e virgola

Comandi speciali come dettagliato nel manuale SQL * Plus sono gli unici che non accettano i punti e virgola. Dov'è che i comandi SQL devono terminare con un ;per essere analizzati dal server.


Il punto e virgola alla fine di un comando è uguale a un'istruzione GO alla fine di un comando eseguito in OSQL / SQLCMD in SQL Server. È il segno che il comando verrà analizzato ed eseguito.
Marian,

7

Quando si immette un'istruzione SQL in SQL * Plus, è necessario sapere quando si è terminata, specialmente se il comando si estende su più righe. Pertanto, richiede un carattere di carattere terminale che può essere impostato conset sqlterminator . Per impostazione predefinita, questo carattere è il punto e virgola:

SQL> select *
  2  from
  3  dual;

D
-
X

Ora, cambiando questo carattere terminale in a # :

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

D
-
X

L'istruzione SQL è stata terminata (fine eseguita) con a #.

Tu chiedi: perché set sqlterminator #non è stato seguito da un punto e virgola? Risposta, perché questa non è un'istruzione SQL. Dichiarazioni relative a SQL * Plus e al suo comportamento, output, connessione asf (comeset echo on e connect system/manager) non sono istruzioni SQL e vengono quindi immesse senza il punto e virgola.

Cosa c'entra questo con / ?

Quando hai inserito un'istruzione SQL, SQL * plus ha riempito qualcosa che chiama buffer. Questo buffer può essere mostrato con il listcomando:

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

(Nota: ho inserito solo l' elenco , il resto viene restituito)

L' /ora esegue ciò che è attualmente nel buffer. Proviamo che:

SQL> /

D
-
X

Come si può vedere, viene eseguita la stessa query.


2

Il punto e virgola è il punto di sequenza per il parser SQL, mentre i comandi eseguiti in SQL * Plus vengono comunque eseguiti immediatamente. Come analogia, confrontare i punti e virgola in un programma C con i comandi immessi nella shell.


0

Il modo in cui lo capisco è che il parser SQL generale condivide molto in comune con il parser javascript generale, in quanto vorrebbe un punto e virgola dopo ogni luogo appropriato, ma non è richiesto se non in determinate circostanze. Quando mi è stato insegnato a scrivere SQL, mi è stato detto che un punto e virgola faceva parte del linguaggio, non un operatore aggiuntivo che potevamo ignorare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.