Temos discutido esta semana na minha empresa sobre como devemos escrever nossos scripts SQL.
Antecedentes: Nosso banco de dados é Oracle 10g (atualizando para 11 em breve). Nossa equipe de DBA usa o SQLPlus para implantar nossos scripts em produção.
Agora, tivemos uma implantação recentemente que falhou porque usava ponto e vírgula e barra ( /
). O ponto-e-vírgula estava no final de cada declaração e a barra estava entre as declarações.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Alguns gatilhos foram adicionados posteriormente no script, algumas visualizações criadas e alguns procedimentos armazenados. Ter tanto o ;
eo /
causada cada declaração para executar duas vezes causando erros (especialmente nas inserções, que precisavam ser único).
No SQL Developer isso não acontece, no TOAD isso não acontece. Se você executar certos comandos, eles não funcionarão sem os /
mesmos.
No PL / SQL, se você tiver um subprograma (DECLARE, BEGIN, END), o ponto-e-vírgula usado será considerado como parte do subprograma, portanto, você deve usar a barra.
Portanto, minha pergunta é a seguinte: se seu banco de dados é Oracle, qual é a maneira correta de escrever seu script SQL? Como você sabe que seu banco de dados é Oracle, você deve sempre usar o /
?
sqlterminator
para!
se quiser) e esta convenção tende a ser seguido por outras ferramentas. A linguagem PL / SQL, no entanto, usa ponto-e-vírgula como um elemento de sintaxe obrigatório.Respostas:
É uma questão de preferência, mas eu prefiro ver scripts que usam consistentemente a barra - dessa forma, todas as "unidades" de trabalho (criando um objeto PL / SQL, executando um bloco anônimo PL / SQL e executando uma instrução DML) podem ser escolhido mais facilmente a olho nu.
Além disso, se você eventualmente mudar para algo como Ant para implantação, simplificará a definição de destinos para ter um delimitador de instrução consistente.
fonte
/
ou;
a resposta de @a_horse_with_no_name ou @Mr_Moneybags para mais contextoSei que esse é um tópico antigo, mas apenas me deparei com ele e acho que isso não foi explicado completamente.
Há uma enorme diferença no SQL * Plus entre o significado de a
/
e a;
porque eles funcionam de maneira diferente.O
;
finaliza uma instrução SQL, enquanto o/
executa o que estiver no "buffer" atual. Então, quando você usa um;
e um/
a declaração é realmente executada duas vezes.Você pode ver facilmente usando
/
uma instrução depois de executar:Nesse caso, percebe-se o erro.
Mas supondo que exista um script SQL como este:
E isso é executado no SQL * Plus, então isso será muito confuso:
A
/
é necessária principalmente para executar instruções que têm incorporados;
como umaCREATE PROCEDURE
declaração.fonte
;
), então você precisa encontrar uma maneira de especificar um delimitador alternativoEu queria esclarecer um pouco mais de uso entre o
;
e o/
No SQLPLUS:
;
significa "encerrar a instrução atual, executá-la e armazená-la no buffer SQLPLUS"<newline>
após uma instrução DML (SELECT, UPDATE, INSERT, ...) ou alguns tipos de instruções DDL (Criando tabelas e exibições) (que não contêm nenhuma;
), significa armazenar a instrução no buffer, mas não a executa./
depois de inserir uma instrução no buffer (com um espaço em branco<newline>
) significa "executar o DML ou DDL ou PL / SQL no buffer.RUN
ouR
é um comando sqlsplus para mostrar / gerar o SQL no buffer e executá-lo. Não terminará uma instrução SQL./
durante a entrada de um DML ou DDL ou PL / SQL significa "encerrar a instrução atual, execute-a e armazene-a no buffer SQLPLUS"NOTA: Como
;
são usadas para o PL / SQL finalizar, uma instrução;
SQLPLUS não pode ser usada para significar "finalizar a instrução atual, execute-a e armazene-a no buffer SQLPLUS" porque queremos que todo o bloco PL / SQL esteja completamente no buffer e execute-o. Os blocos PL / SQL devem terminar com:fonte
Quase todas as implantações do Oracle são feitas através do SQL * Plus (aquela pequena e estranha ferramenta de linha de comando que seu DBA usa). E no SQL * Plus, uma barra solitária significa basicamente "reexecutar o último comando SQL ou PL / SQL que acabei de executar".
Vejo
A regra prática seria usar barras com coisas que fazem
BEGIN .. END
ou onde você pode usarCREATE OR REPLACE
.Para pastilhas que precisam ser de uso exclusivo
fonte
Pelo meu entendimento, todas as instruções SQL não precisam de barra, pois serão executadas automaticamente no final de ponto-e-vírgula, incluindo instruções DDL, DML, DCL e TCL.
Para outros blocos PL / SQL, incluindo Procedimentos, Funções, Pacotes e Acionadores, por serem programas de várias linhas, o Oracle precisa de uma maneira de saber quando executar o bloco, portanto, precisamos escrever uma barra no final de cada bloco para deixe a Oracle executá-lo.
fonte
Eu só uso a barra uma vez no final de cada script, para informar ao sqlplus que não há mais linhas de código. No meio de um script, eu não uso uma barra.
fonte