Двойная таблица используется для выбора псевдо столбцов. это ссорится и один столбец DUMMY, который имеет значение X.
У меня есть два вопроса
Как двойное способное для предоставления значения, например:
select sysdate from dual
приведет к текущей дате и времени. Как это возможно?
Псевдостолбец - это функция, которая возвращает сгенерированное системой значение. sysdate
- это функция, которая возвращает текущую дату; rownum
- это псевдоколонка, которая возвращает номер строки в наборе результатов.
Эта номенклатура относится к ранним дням Oracle, до появления PL/SQL. Она просто означает, что мы можем использовать эти функции в проекции оператора SELECT, точно так же, как столбцы таблицы. Сегодня мы можем писать свои собственные функции и использовать их в SQL-запросах, не моргая, и поэтому фраза "псевдоколонка" немного смущает.
Особенность, отличающая функцию от псевдостолбца, заключается в том, что псевдостолбец возвращает разное значение для каждой строки в наборе результатов, тогда как функция возвращает одно и то же значение (если только какой-либо столбец таблицы не передается в качестве параметра для получения значения).
Dual - еще один почтенный кусочек истории Oracle. Это таблица, которая содержит одну строку, и которая, как известно базе данных, содержит одну строку. Таким образом, оператор select, который вы цитируете, просто говорит: "Дайте мне текущее время даты". Функционально это эквивалентно
select sysdate
from emp
where rownum = 1
/
В PL/SQL двойное select from не имеет смысла. Мы можем просто написать следующее:
l_date := sysdate;
Одним из распространенных применений DUAL было получение следующего значения последовательности в триггере. Начиная с 11g мы можем сделать ...
:new.id := my_seq.nextval;
Под обложкой это все еще выполняется select my_seq.nextval into :new.id from dual;
В SQL есть ряд встроенных функций, для вызова которых не нужны круглые скобки после них. Одной из таких функций в Oracle является SYSDATE.
Помните, если у вас есть таблица, оператор SELECT без ограничивающего условия (WHERE clause) обычно возвращает одну строку данных для каждой строки в таблице. Таким образом, при наличии таблицы:
CREATE TABLE Ex1(Dummy CHAR(10) NOT NULL);
INSERT INTO Ex1 VALUES('Abacus');
INSERT INTO Ex1 VALUES('Sedentary');
INSERT INTO Ex1 VALUES('Caucasus');
Выполнение оператора SELECT:
SELECT Dummy FROM Ex1;
вернет 3 строки. Теперь, предположим, я напишу оператор так:
SELECT 'ABC', Dummy, SYSDATE FROM Ex1;
Это также вернет 3 строки:
Если я опущу столбец Dummy:
SELECT 'ABC', SYSDATE FROM Ex1;
я получу:
А если я опущу строковый литерал:
SELECT SYSDATE FROM Ex1;
Я получу:
А если удалить две строки и запустить запрос заново, то получается:
DELETE FROM Ex1 WHERE Dummy > 'B';
SELECT SYSDATE FROM Ex1;
Получается:
Потому что в таблице Ex1 всего одна строка данных.
Номинально, я мог бы сделать:
UPDATE Ex1 SET Dummy = 'X';
RENAME TABLE Ex1 AS Dual;
Конечно, вы не можете этого сделать - я не уверен, поддерживает ли Oracle оператор RENAME TABLE, и, вероятно, он не позволит вам переименовать вашу таблицу, чтобы ее можно было спутать со встроенной таблицей DUAL. Но концептуально таблица Ex1 с одной строкой в ней изоморфна DUAL.
Если Oracle не имеет специального значения для этого термина, то псевдостолбец - это столбец, который кажется частью таблицы, но на самом деле не хранится как данные в таблице. Классическим примером является номер строки:
SELECT ROWNUM, * FROM SomeTable
При выводе кажется, что в таблице есть столбец ROWNUM (ROWID в Informix, с которым я наиболее хорошо знаком), но он не хранится непосредственно в СУБД. В разных СУБД есть и другие различные псевдостолбцы, для разных целей.
Иногда трудно отличить псевдостолбец от функции.