псевдостолбцы и двойная таблица - что они на самом деле означают? - PullRequest
4 голосов
/ 03 марта 2010

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

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

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

    select sysdate from dual
    

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

Ответы [ 4 ]

6 голосов
/ 03 марта 2010

Псевдостолбец - это функция, которая возвращает сгенерированное системой значение. sysdate - это функция, которая возвращает текущую дату и время; rownum - псевдостолбец, который возвращает номер строки в наборе результатов.

Номенклатура датируется более ранними днями Oracle, до того, как у нас был PL / SQL. Это просто означает, что мы можем использовать эти функции в проекции оператора SELECT, точно так же, как столбцы таблицы. В настоящее время мы можем писать свои собственные функции и использовать их в выражениях SQL, не мигая, и поэтому фраза «псевдостолбец» немного сбивает с толку.

Функция, которая отличает функцию от псевдостолбца, состоит в том, что псевдостолбец возвращает различное значение для каждой строки в наборе результатов , тогда как функция возвращает то же значение (если только какой-либо столбец в таблице передается в качестве параметра для получения значения).

Dual - еще одна почтенная часть истории Oracle. Это таблица, которая содержит одну строку, а , которую знает база данных, содержит одну строку . Таким образом, в выбранном вами заявлении просто говорится «дайте мне текущую дату и время». Функционально эквивалентно

select sysdate 
from emp
where rownum = 1
/

В PL / SQL выбор из двойного обязателен. Мы можем просто закодировать это:

l_date := sysdate;

Одно из распространенных применений для DUAL - получение следующего значения последовательности в триггере. С 11g мы можем сделать ...

:new.id := my_seq.nextval;

Под прикрытием это все еще выполняется select my_seq.nextval into :new.id from dual;

1 голос
/ 03 марта 2010

2. Как выбор из DUAL дает системное время?

В SQL есть ряд встроенных функций, которым не нужны скобки после их вызова. Одной из таких функций в Oracle является SYSDATE.

Помните, что если у вас есть таблица, оператор SELECT без условия ограничения (предложение WHERE) обычно возвращает одну строку данных для каждой строки в таблице. Итак, с учетом таблицы:

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, Сидячий, 2010-03-03
  • Азбука, Кавказ, 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, с которым я больше всего знаком), но он не хранится напрямую в СУБД. Разные СУБД имеют разные псевдоколонки для разных целей.

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

0 голосов
/ 31 июля 2018

псевдо столбцы: ROWID, ROWNUM, LEVEL

0 голосов
/ 18 ноября 2014

Псевдостолбец - это присвоенное Oracle значение (псевдополе), но не сохраненное на диске.

Псевдоколонки не являются реальными столбцами в таблице, но ведут себя как столбцы.

Например, вы можете выбрать значения из псевдостолбца. Однако вы не можете вставить, обновить или удалить из псевдостолбца. Также обратите внимание, что псевдоколонки разрешены в инструкциях SQL, но не в процедурных инструкциях.

ПРИМЕЧАНИЕ: - псевдоколонки допускаются в инструкциях SQL, но не в процедурных инструкциях.

SQL> SELECT sysdate, systimestamp FROM dual; SYSDATE SYSTIMESTAMP


13-DEC-07 13-DEC-07 10.02.31.956842 AM +02: 00

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