псевдо столбцы и таблица DUAL - что они на самом деле имеют в виду?

Двойная таблица используется для выбора псевдо столбцов. это ссорится и один столбец DUMMY, который имеет значение X.

У меня есть два вопроса

  1. Что на самом деле означает псевдо столбец?
  2. Как двойное способное для предоставления значения, например:

    select sysdate from dual
    

    приведет к текущей дате и времени. Как это возможно?

5
задан LittleBobbyTables 4 December 2014 в 20:13
поделиться

2 ответа

Псевдостолбец - это функция, которая возвращает сгенерированное системой значение. 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;

7
ответ дан 14 December 2019 в 04:36
поделиться

2. Как выбор из 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 строки:

  • ABC, Abacus, 2010-03-03
  • ABC, Sedentary, 2010-03-03
  • ABC, Caucasus, 2010-03-03

Если я опущу столбец Dummy:

SELECT 'ABC', SYSDATE FROM Ex1;

я получу:

  • ABC, 2010-03-03
  • ABC, 2010-03-03
  • ABC, 2010-03-03

А если я опущу строковый литерал:

SELECT SYSDATE FROM Ex1;

Я получу:

  • 2010-03-03
  • 2010-03-03
  • 2010-03-03

А если удалить две строки и запустить запрос заново, то получается:

DELETE FROM Ex1 WHERE Dummy > 'B';
SELECT SYSDATE FROM Ex1;

Получается:

  • 2010-03-03

Потому что в таблице Ex1 всего одна строка данных.

Номинально, я мог бы сделать:

 UPDATE Ex1 SET Dummy = 'X';
 RENAME TABLE Ex1 AS Dual;

Конечно, вы не можете этого сделать - я не уверен, поддерживает ли Oracle оператор RENAME TABLE, и, вероятно, он не позволит вам переименовать вашу таблицу, чтобы ее можно было спутать со встроенной таблицей DUAL. Но концептуально таблица Ex1 с одной строкой в ней изоморфна DUAL.

1. Что такое псевдостолбец?

Если Oracle не имеет специального значения для этого термина, то псевдостолбец - это столбец, который кажется частью таблицы, но на самом деле не хранится как данные в таблице. Классическим примером является номер строки:

SELECT ROWNUM, * FROM SomeTable

При выводе кажется, что в таблице есть столбец ROWNUM (ROWID в Informix, с которым я наиболее хорошо знаком), но он не хранится непосредственно в СУБД. В разных СУБД есть и другие различные псевдостолбцы, для разных целей.

Иногда трудно отличить псевдостолбец от функции.

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: