formato de escrita.ficheiros sql [duplicado]
- Quando preciso de usar um ponto e vírgula contra uma barra no Oracle SQL? 6 respostas
digamos que eu tenho algumas consultas sql ou blocos PL / SQL que supostamente são executados em uma base de dados, eu escrevi todos os scripts em A.SQL file e tentou executá-lo usando sqlplus CMD, e eu geralmente fico estranho saida.
Todos os scripts não são executados apenas Primeiro são executados, e eu acho que isso é por causa do uso impróprio '/'
personagem. Então a questão é como devo formatá-lo para que mesmo que eu esteja escrevendo mais de um script em um arquivo .sql
. Todos os arquivos devem ser executados com sucesso.
CREATE TYPE schema1.ATTRIBUTES AS OBJECT (
object_name VARCHAR2(100),
object_value VARCHAR2(100));
CREATE TYPE schema1.ATTRIBUTETABLE AS TABLE OF KPNCUST.ATTRIBUTES;
COMMIT;
/
Quando estou a executar este script usando o sqlplus, estou a ter o tipo criado com erros de compilação, mas ao usar o TOAD não estou a ter nenhum erro.
2 answers
Se utilizar uma única declaração sql, termine-a com ;
ou /
, não com ambas! Pode utilizar
COMMIT;
Ou
COMMIT
/
Ambos os exemplos fazem o mesmo trabalho.
De acordo com o seu exemplo:
COMMIT;
/
COMMIT
é uma simples declaração SQL. É executado por causa de ponto e vírgula (;) no final da linha. SQLPlus lembra-se da última declaração SQL. O carácter barra ( / ) executa a última instrução SQL. Então, no seu caso, o commit é executado duas vezes.
Outro caso é PLSQL block-semicolon (;) não termina o bloco inteiro como uma declaração. Termina apenas uma linha específica de código.
Por exemplo:
BEGIN
COMMIT;
END;
/
O código é executado uma vez. O SQLPlus identifica o código como bloco PLSQL e não interpreta o ponto e vírgula como fim da declaração. Deve usar tanto o ponto-e-vírgula como a barra no fim do bloco quando o quiser executar;
No seu código original, tudo, desde o primeiro CREATE TYPE
até ao final /
, está a ser interpretado como um único comando, e tomado como um todo, tudo depois do primeiro ponto e vírgula É uma sintaxe inválida para a primeira criação. Se o fizesses show errors
Depois da tua solitária /
verias:
LINE/COL ERROR
-------- -------------------------------------------
5/1 PLS-00103: Encountered the symbol "CREATE"
A documentação SQL * Plus descreve o que /
faz, e também diz Como executar blocos PL/SQL. Pode não ser óbvio neste caso, mas o seu código de exemplo tem dois PL / SQL blocos:
Os procedimentos armazenados são funções PL / SQL, pacotes ou procedimentos. Para criar procedimentos armazenados, você usa os seguintes comandos SQL CREATE:
- ...
- CRIAR O TIPO
Se introduzir algum destes comandos, coloca-o no modo PL/SQL, onde poderá introduzir o seu subprograma PL/SQL. Para mais informações, consulte os blocos PL/SQL em execução. Quando terminar de escrever o seu subprograma PL/SQL, indique um período (.) em uma linha por si só para terminar Modo PL / SQL. Para executar o comando SQL e criar o procedimento armazenado, deverá indicar RUN ou slash (/). Um ponto-e-vírgula (;) não irá executar estes comandos criar.
Então você precisa de uma barra após cada um dos seus comandos criar, e não precisa de ponto e vírgula para estes exemplos:
CREATE TYPE schema1.ATTRIBUTES AS OBJECT (
object_name VARCHAR2(100),
object_value VARCHAR2(100))
/
CREATE TYPE schema1.ATTRIBUTETABLE AS TABLE OF schema1.ATTRIBUTES
/
COMMIT;
Se tiver isso num script (com um nome de esquema válido, ou omitindo-o para o seu próprio esquema) e executar o script através de SQL * Plus verá:
SQL> @your_script.sql
Type created.
Type created.
Commit complete.
E podes verificar se ambos estavam criado:
SQL> select object_type, object_name, status from user_objects where object_name like 'ATTR%';
OBJECT_TYPE OBJECT_NAME STATUS
------------------- ------------------------------ -------
TYPE ATTRIBUTES VALID
TYPE ATTRIBUTETABLE VALID
O teu commit precisa de um ponto e vírgula ou de uma barra, mas não de ambos - irá cometer duas vezes se o fizeres, o que é apenas uma sobrecarga extra. Você realmente não precisa se comprometer de todo, como DDL implicitamente se compromete de qualquer maneira.
Então se você tem um bloco PL / SQL ou qualquer coisa que SQL * Plus vistas como um procedimento armazenado você tem que submetê-lo com uma barra. Para tudo o resto você pode usar um ponto e vírgula (Que você pode até mesmo mudar com set sqlterminator
) ou um corte, mas não tanto como isso. vai executá-lo duas vezes.
Pode preferir usar barras de forma consistente, mesmo para SQL simples, ou para todas as DDL. Mas lembre-se que a barra precisa ser o primeiro personagem em uma nova linha, enquanto o ponto e vírgula Pode imediatamente seguir o comando real. É realmente uma questão de estilo e consistência, a menos que você tenha padrões de codificação que você precisa seguir - ou funciona, então use o que faz mais sentido ou é mais legível para você.