Qual é o significado de um ponto e vírgula no final dos comandos SQL * Plus?

16

Algumas instruções, como criar tabela, inserir no etc, levam um ponto e vírgula no final:

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

enquanto outros gostam

set echo on
connect system/manager

passar sem o ponto e vírgula também.

Qual é o raciocínio por trás disso? Como posso decidir onde colocar o ponto-e-vírgula e onde não?

lazer
fonte
6
+1 Para tornar as coisas mais confusas, você pode usar / na linha a seguir, em vez de; em alguns casos.
bernd_k

Respostas:

15

A execução da instância local na devolução. Comandos de várias linhas para o servidor são executados em ponto e vírgula

Comandos especiais, conforme detalhado no manual SQL * Plus, são os únicos que não aceitam ponto e vírgula. Onde os comandos SQL devem terminar com um ;para serem analisados ​​pelo servidor.

Brian Ballsun-Stanton
fonte
O ponto-e-vírgula no final de um comando é o mesmo que uma instrução GO no final de um comando executado no OSQL / SQLCMD no Sql Server. É o sinal de que o comando será analisado e executado.
Marian
7

Quando você está inserindo uma instrução SQL no SQL * Plus, ele precisa saber quando você termina, especialmente se o comando abrange várias linhas. Portanto, requer um caractere de caractere de terminal que pode ser definido com o set sqlterminator. Por padrão, esse caractere é o ponto e vírgula:

SQL> select *
  2  from
  3  dual;

D
-
X

Agora, alterando esse caractere de terminal para #:

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

D
-
X

A instrução SQL foi finalizada (finalizada) com a #.

Você pergunta: por que set sqlterminator #não foi seguido por um ponto e vírgula? Resposta, porque esta não é uma instrução SQL. As instruções relacionadas ao SQL * Plus e seu comportamento, saída e conexão asf (como set echo one connect system/manager) não são instruções SQL e, portanto, são inseridas sem o ponto e vírgula.

O que isso tem a ver com o /?

Quando você inseriu uma instrução SQL, o SQL * plus preencheu algo que chama de buffer. Este buffer pode ser mostrado com o listcomando:

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

(Nota: eu entrei apenas na lista , o restante é retornado)

O /agora executa o que está atualmente no buffer. Vamos tentar isso:

SQL> /

D
-
X

Como pode ser visto, a mesma consulta é executada.

René Nyffenegger
fonte
2

O ponto e vírgula é o ponto de sequência do analisador SQL, enquanto os comandos executados no SQL * Plus são executados imediatamente de qualquer maneira. Como analogia, compare os pontos e vírgulas em um programa C com os comandos inseridos no shell.

Gaius
fonte
0

Pelo que entendi, o analisador SQL geral compartilha muito em comum com o analisador javascript geral, pois gostaria de um ponto-e-vírgula após cada local apropriado, mas não é necessário, exceto em determinadas circunstâncias. Quando fui ensinado a escrever SQL, disseram-me que um ponto e vírgula fazia parte da linguagem, e não um operador extra que poderíamos ignorar.

jcolebrand
fonte