Как завершить ввод CREATE TYPE в sqlplus (Oracle)?

Я пытаюсь ввести CREATE TYPE в свой терминал, но не могу понять, как это закончить. Вот мой конкретный запрос:

CREATE TYPE testtype AS OBJECT (
    id int
);
/

Затем он отказывается выполнять какую-либо операцию, а вместо этого ожидает ввода дополнительных данных. Я могу без проблем вводить почти любой другой тип запроса. Что здесь происходит? Есть ли какой-то завершающий шаг, который мне нужно сделать, чтобы закончить?


person Alex    schedule 22.04.2011    source источник
comment
Вы нажимали ввод после ввода /?   -  person Chandu    schedule 22.04.2011
comment
Несколько раз. Вот что меня смущает, что энтер явно проходит, а база на него никак не реагирует.   -  person Alex    schedule 22.04.2011
comment
Не уверен, почему вы столкнулись с этим, просто набрал то же самое в моем SQL * Plus, созданном без заминки. Вы уверены, что там нет фантомных пространств или тому подобного?   -  person Sathyajith Bhat    schedule 22.04.2011


Ответы (3)


Когда вы говорите, что он «вместо этого ожидает ввода данных», вы имеете в виду, что 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
comment
Идея Луки о том, что творение выполняется, но по какой-то причине зависает, кажется разумной. Если это так, пока он зависает, проверьте V$SESSION_WAIT для сеанса, чтобы узнать, какое событие он ожидает. Если это enqueue, то блокирующая ссылка, которую дал Люк, актуальна; но это могут быть и другие вещи (например, ожидание защелки). Другой подход заключается в том, чтобы активировать трассировку SQL перед выполнением команды, тогда вы можете увидеть в файле трассировки, на чем она висит. - person Dave Costa; 22.04.2011
comment
Оказывается, база данных невероятно медленная. Это задание класса, и мне понятно, почему никто не использует ORDBMS на Oracle... - person Alex; 24.04.2011

Должно быть что-то, что вы нам не говорите:

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>
person a_horse_with_no_name    schedule 22.04.2011

A видел подобное поведение и это, когда в таблице были открытые транзакции (и, следовательно, блокировки).

Командная строка sqlplus с радостью начнет выполняться, а затем будет ждать вечно.

Решение: зафиксировать/откатить и закрыть другие сеансы

person x29a    schedule 13.12.2016