Как мне завершить ввод CREATE TYPE в sqlplus (Oracle)? - PullRequest
3 голосов
/ 22 апреля 2011

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

CREATE TYPE testtype AS OBJECT (
    id int
);
/

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

Ответы [ 3 ]

5 голосов
/ 22 апреля 2011

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

Не могу поверить, что проблема в том, что тип уже существует или у вас нет разрешения на создание типа. В обоих случаях вы должны сразу получить ошибку.

3 голосов
/ 22 апреля 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>
0 голосов
/ 13 декабря 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...