formato de escrita.ficheiros sql [duplicado]

Esta pergunta já tem uma resposta:
  • 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.

Author: viveksinghggits, 2016-06-02

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;

 2
Author: Petr Pribyl, 2016-06-02 06:48:36

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ê.

 2
Author: Alex Poole, 2016-06-02 09:01:17