Algumas instruções como criar tabela, inserir em 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?
Os comandos para a instância local são executados no retorno. Comandos de várias linhas para o servidor executados em ponto-e-vírgula
Os comandos especiais detalhados no manual do SQL*Plus são os únicos que não aceitam ponto-e-vírgula. Onde os comandos SQL devem terminar com a
;
para serem analisados pelo servidor.Quando você está inserindo uma instrução SQL no SQL*Plus, ele precisa saber quando você terminou, especialmente se o comando abrange várias linhas. Portanto, requer um caractere de terminal que pode ser definido com o
set sqlterminator
. Por padrão, esse caractere é o ponto e vírgula:Agora, alterando este caractere terminal para um
#
:A instrução SQL foi finalizada (fim da execução) com um
#
.Você pergunta: por que
set sqlterminator #
não foi seguido de ponto e vírgula? Responda, porque esta não é uma instrução SQL. As instruções relacionadas ao SQL*Plus e seu comportamento, saída, conexão asf (comoset echo on
econnect 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ê insere uma instrução SQL, o SQL*plus preenche algo que chama de buffer. Este buffer pode ser mostrado com o
list
comando:(Obs: só entrei list , o resto é retornado)
O
/
agora executa o que está atualmente no buffer. Vamos tentar isso:Como pode ser visto, a mesma consulta é executada.
O ponto e vírgula é o ponto de sequência para o 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.
Pelo que entendi, o analisador SQL geral tem 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 certas circunstâncias. Quando me ensinaram a escrever SQL, disseram-me que o ponto-e-vírgula fazia parte da linguagem, não um operador extra que poderíamos ignorar.