Когда вы говорите, что он «вместо этого ожидает больше ввода», вы имеете в виду, что 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 .
Не могу поверить, что проблема в том, что тип уже существует или у вас нет разрешения на создание типа. В обоих случаях вы должны сразу получить ошибку.