Por que o SQL * PLUS precisa de uma barra após CREATE TYPE?

14

Eu apenas tive o problema de definir um tipo e testá-lo no TOAD e tudo estava bem. Mas rodando sob o SQL * PLUS, ocorreu um erro.

Exemplo:

CREATE OR REPLACE TYPE MyType AS OBJECT (
    Item1 NUMBER,
    Item2 NUMBER
);

Por alguma razão eu tenho que adicionar uma barra aqui

CREATE OR REPLACE TYPE MyType AS OBJECT (
    Item1 NUMBER,
    Item2 NUMBER
);
/

Para mim, é semelhante a uma instrução Create Table, que não requer uma barra. Eu acho isso bastante confuso. Sei como funciona, mas alguém pode explicar por que essa decisão de design foi tomada?

bernd_k
fonte
2
Não, a pergunta Por que não é respondida lá. Parece ser uma decisão arbitrária de design da equipe sql * plus.
22811 bernd_k
Há uma grande resposta: stackoverflow.com/a/10207695/1568658
Eric Wang

Respostas:

15

você precisa de um /bloco PL / SQL no SQL * Plus:

SQL> begin
  2     null;
  3  end;
  4  -- here you need a /
  5  /

PL/SQL procedure successfully completed

Isso significa que o SQL * Plus sabe que você terminou sua declaração (que pode incluir intermediário, sem finalização ;).

Os tipos SQL podem incluir código PL / SQL; portanto, os desenvolvedores do SQL * Plus decidiram que você precisa de um /em todos os casos após um CREATE TYPE:

SQL> CREATE OR REPLACE TYPE t AS OBJECT (
  2     x NUMBER,
  3     MEMBER PROCEDURE setx(p_x NUMBER)
  4  );
  5  /

Type created

SQL> CREATE OR REPLACE TYPE BODY t AS
  2     MEMBER PROCEDURE setx (p_x NUMBER) IS
  3     BEGIN
  4        x := p_x;
  5     END;
  6  END;
  7  /

Type body created

Nota : você também precisa de um /depois de definir um procedimento, um pacote ou um corpo do pacote (pelo mesmo motivo).

Vincent Malgrat
fonte