Когда вы говорите, что он «вместо этого ожидает ввода данных», вы имеете в виду, что 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.
Обратите внимание, что если вы используете оболочку, такую как 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
В этом случае строки hello
и is anybody there?
были проигнорированы SQL*Plus, так как он был занят, когда я их ввел. (Он может выбрать их чтение позже - они будут доступны для чтения из его стандартного ввода - но в этом случае он предпочел не делать этого.)
Чтобы оператор 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
сам по себе, поэтому я предложил триггеры. Вы также можете попробовать прочитать эту статью о блокировках и блокировках в Oracle.
Я не могу поверить, что проблема связана с тем, что тип уже существует или у вас нет разрешения на создание типа. В обоих случаях вы должны сразу получить сообщение об ошибке.
person
Luke Woodward
schedule
22.04.2011