为什么 SQL*PLUS 在 CREATE TYPE 后需要一个斜线?

ber*_*d_k 14 oracle sqlplus user-defined-type

我只是遇到了问题,我定义了一个类型并在 TOAD 中对其进行了测试,一切正常。但是在 SQL*PLUS 下运行它抛出了一个错误。

例子:

CREATE OR REPLACE TYPE MyType AS OBJECT (
    Item1 NUMBER,
    Item2 NUMBER
);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我必须在这里添加斜线

CREATE OR REPLACE TYPE MyType AS OBJECT (
    Item1 NUMBER,
    Item2 NUMBER
);
/
Run Code Online (Sandbox Code Playgroud)

对我来说,它看起来类似于不需要斜线的 Create Table 语句。我觉得比较混乱。我知道它是如何工作的,但谁能解释为什么做出这个设计决定?

Vin*_*rat 15

您需要/在 SQL*Plus 中的 PL/SQL 块之后:

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

PL/SQL procedure successfully completed
Run Code Online (Sandbox Code Playgroud)

这样 SQL*Plus 就知道您已经完成了您的语句(可能包括中间的、非终止的;)。

SQL 类型可能包括 PL/SQL 代码,因此 SQL*Plus 开发人员决定/在所有情况下都需要在 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
Run Code Online (Sandbox Code Playgroud)

注意/在定义过程、包或包体之后还需要一个(出于同样的原因)。