我正在尝试在终端输入一个CREATE TYPE,我无法弄清楚如何完成它。这是我的具体查询:
CREATE TYPE testtype AS OBJECT (
id int
);
/
然后拒绝执行任何操作,而是等待更多输入。我可以毫不费力地输入几乎所有其他查询类型。到底是怎么回事?我需要做一些最终确定的步骤来完成它吗?
答案 0 :(得分:5)
当你说它“等待更多输入”时,你是说SQL * Plus要求另一行输入,还是数据库显然没有响应?
换句话说,你得到这个:
SQL> create type testtype ( 2 id int 3 ); 4 / 5
(5
表示SQL * Plus认为还有更多内容),或者你得到这样的东西:
SQL> create type testtype ( 2 id int 3 ); 4 / ^Ccreate type testtype ( * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-01013: user requested cancel of current operation
(我在没有成功完成的情况下跑了几秒钟后打断了它。)
对于这个答案的其余部分,我会假设后者。我不能诚实地相信SQL * Plus会无法识别输入的结束。单独一行/
(即使在其中一侧或两侧都有空格)被解释为输入的明确结束,即使输入不是有效的SQL。
请注意,如果您使用的是shell,例如bash,即使您正在运行的程序当前没有请求用户输入,也可以键入文本。例如:
SQL> create type testtype as object ( 2 id int 3 ); 4 / hello is anybody there? ^Ccreate type testtype as object ( * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-01013: user requested cancel of current operation
在这种情况下,SQL * Plus忽略了行hello
和is anybody there?
,因为当我输入它时它很忙。(它可能会选择稍后读入它们 - 它们将可用阅读其标准输入 - 但在这种情况下,它选择不。)
要使create type
语句运行几秒钟而未完成,我创建了以下(适当命名的)触发器:
CREATE OR REPLACE TRIGGER utterly_stupid
BEFORE CREATE ON SCHEMA
BEGIN
IF UPPER(ora_dict_obj_name) = 'TESTTYPE' THEN
LOOP
NULL;
END LOOP;
END IF;
END;
/
如果您尝试创建名为“TESTTYPE”的对象,则此触发器会导致无限循环。
我并不是说你的数据库中有一个像你这样愚蠢的触发器,但你可能想看看数据库中的任何BEFORE CREATE
或AFTER CREATE
触发器。
另一种可能是AFTER SERVERERROR ON DATABASE
触发器。也许您的create type
语句会触发错误,并导致其中一个触发器触发。你的数据库中有没有这些?
似乎挂起的会话通常是由锁定引起的。如果另一个用户对您尝试更新的行或表有锁定,则会话将阻塞,直到他们释放锁定为止。但是很难看出它本身可以阻止create type
语句的原因,这就是我提出触发器的原因。您也可以尝试阅读this article on locking and blocking in Oracle。
我无法相信问题是由于已存在的类型或您无权创建类型。在这两种情况下,您都应该立即得到错误。
答案 1 :(得分:3)
必须有一些你没有告诉我们的事情:
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning and OLAP options SQL> CREATE TYPE testtype AS OBJECT ( 2 id int 3 ); 4 / Type created. SQL>
答案 2 :(得分:0)