Внутренняя функциональность таблицы DUAL?
Помешает ли локальная база данных, если мы создадим таблицу DUAL?
Пожалуйста, предложите мне?
create table DUAL
(
x varchar2(1)
);
2 ответа
Помешает ли локальная база данных, если мы создадим таблицу DUAL?
Да, конечно, странные вещи могут и будут происходить. ДВОЙНОЙ принадлежит SYS. SYS владеет словарем данных, поэтому DUAL является частью словаря данных. Вы не должны изменять словарь данных через SQL никогда.
И первый вопрос: "Как вы будете гарантировать только одну строку в вашей собственной таблице DUAL"?
Это восходит к оригинальной статье Стивена Фюрштайна " Самостоятельное управление PL/SQL ", где он объясняет "Используйте свою собственную таблицу DUAL". Но это было тогда, когда ДВОЙНОЙ стол был склонен к таким вещам.
Однако в последних выпусках структура таблицы DUAL была сделана надежной, и вы не можете иметь больше одной строки. Вот доказательство:
SQL> conn sys@pdborcl as sysdba
Enter password:
Connected.
SQL> insert into dual select * from dual;
1 row created.
SQL> select * from dual;
D
-
X
Я знаю, мало кто будет утверждать, что мы можем обработать одну строку с нашей собственной таблицей DUAL, используя триггер или ROWNUM =1, однако вы скоро поймете минусы. Это просто не нужно от 10g на палатах, так как таблица DUAL теперь является структурой памяти, и вы не можете добавить к ней строку, как показано выше.
Представьте себе ситуацию, когда вы создали свою собственную таблицу DUAL и используете вызов таблицы DUAL в своем коде PL/SQL для получения USER, SYSDATE, SYSTIMESTAMP и т. Д.
Этот код взят из файла stdbody.sql, поставляемого с Oracle Database:
1 FUNCTION USER
2 RETURN VARCHAR2
3 IS
4 c VARCHAR2 (255);
5 BEGIN
6 SELECT USER
7 INTO c
8 FROM SYS.DUAL;
9
10 RETURN c;
11 END;
Если в вашей собственной таблице DUAL когда-либо будет более одной строки, каждый вызов функции USER в вашем коде PL/SQL завершится с ошибкой TOO_MANY_ROWS.
Итог: вся дискуссия об использовании вашей собственной таблицы DUAL имела смысл еще до 10g дней. Таблица DUAL теперь является надежной структурой памяти и не позволяет добавлять в нее строки. Поэтому не имеет смысла использовать собственную таблицу DUAL, а не SYS.DUAL.
Нет, вы не можете создать двойную таблицу. Двойная таблица принадлежит SYS, а SYS - словарь данных, поэтому вы не можете его создать.
См вики
Таблица DUAL - это специальная таблица из одной строки, присутствующая по умолчанию во всех установках базы данных Oracle. Он подходит для использования при выборе псевдостолбца, такого как SYSDATE или USER. В таблице есть один столбец VARCHAR2(1) с именем DUMMY, который имеет значение "X".
Даже если вы попытаетесь создать таблицу DUAL, это создаст для вас проблемы, поскольку каждый раз движок Oracle должен гарантировать, что вы не вызываете двойную таблицу SYS. Вам нужно также указать базу данных и схему. Это может привести к слишком большой проблеме неоднозначности для движка Oracle. Оптимизатор Oracle знает все, что делает DUAL, и что он должен делать, и затем он делает вещи, основываясь на этом.
Справочник по SQL:
DUAL - это таблица, автоматически создаваемая Oracle Database вместе со словарем данных. DUAL находится в схеме пользователя SYS, но доступен под именем DUAL для всех пользователей. Он имеет один столбец DUMMY, определенный как VARCHAR2(1), и содержит одну строку со значением X. Выбор из таблицы DUAL полезен для вычисления константного выражения с помощью оператора SELECT. Поскольку DUAL имеет только одну строку, константа возвращается только один раз. В качестве альтернативы вы можете выбрать константу, псевдостолбец или выражение из любой таблицы, но значение будет возвращено столько раз, сколько строк в таблице. Обратитесь к разделу "О функциях SQL" для получения множества примеров выбора постоянного значения из DUAL.
Начиная с Oracle Database 10g Release 1, логический ввод-вывод не выполняется для таблицы DUAL при вычислении выражения, не содержащего столбец DUMMY. Эта оптимизация указана как БЫСТРЫЙ ДВОЙНОЙ в плане выполнения. Если вы ВЫБИРАЕТЕ столбец DUMMY из DUAL, то эта оптимизация не выполняется и происходит логический ввод-вывод.