Вставляя несколько строк, что делает оператор "select 1 from dual"? - программирование
Подтвердить что ты не робот

Вставляя несколько строк, что делает оператор "select 1 from dual"?

Вставляя несколько строк в таблицу, используя следующий стиль:

insert all

into ghazal_current (GhazalName,Rating) values('Ajab Apna Haal Hota Jo Visaal-e-Yaar Hota',5)
into ghazal_current (GhazalName,Rating) values('Apne Hothon Par Sajana Chahta Hun',4)
into ghazal_current (GhazalName,Rating) values('Shaam Se Aankh Mein Nami Si Hai',4)
into ghazal_current (GhazalName,Rating) values('Tumhe Yaad Ho Ke Na Yaad Ho',3)

select 1 from dual;

Что означает выражение select 1 from dual? Для чего он предназначен?

4b9b3361

Ответ 1

DUAL - это встроенная таблица, полезная, поскольку гарантируется возвращает только одну строку. Это означает, что DUAL может использоваться для получения псевдо-столбцов, таких как user или sysdate, результатов вычислений и т.п. Владелец DUAL - SYS, но к нему может обращаться каждый пользователь. DUAL хорошо освещена в документации. Узнайте больше.

В вашем случае SELECT 1 FROM DUAL; просто вернет 1. Это вам нужно, потому что синтаксис INSERT ALL требует предложение SELECT, но вы не запрашиваете входные значения из таблицы.

Ответ 2

Краткий повторный ввод в таблицы с одной строкой

Некоторые базы данных SQL требуют, чтобы все значения приходили из таблицы или табличного объекта, тогда как другие разрешали запросы создавать значения ex nihilo:

-- MySQL, sqlite, PostgreSQL, HSQLdb, and many others permit
-- a "naked" select:
SELECT 1;

-- Others *require* a FROM target, like Oracle.
SELECT 1 FROM DUAL;

-- ...and Firebird/Interbase:
SELECT 1 FROM RDB$DATABASE;

-- ...and DB2:
SELECT 1 FROM SYSIBM.SYSDUMMY1;

Здесь важна мощность DUAL. Если в нем было несколько строк, в вашем результирующем наборе было бы несколько строк. Что происходит, например, когда вы SELECT 1 FROM A_Table_With_Ten_Rows?

Почему здесь используется DUAL

Конструкция SQL VALUES (<row-value-expression>) - это конструктор значений строки. VALUES (1, 2, 3) "создает" строку значений, как это делает SELECT 1, 2, 3.

Oracle, конечно, требует, чтобы эти значения откуда-то пришли.

В качестве демонстрации вместо SELECTing из DUAL в конце INSERT ALL попробуйте таблицу с N строками, и вы увидите, что каждая строка VALUES() вставляется N раз.

Ответ 3

Есть несколько примеров использования двойного в запросах:

   select sysdate from dual  /--it returns date of system
    SELECT chr(223) FROM dual /--it returns character of Asciهi code
    select  my_sequence.nextval from dual; /-- It returns the next value of a sequence
    select to_char(sysdate,'yyyy/mm/dd','nls_calendar=persian')from dual 
    /--returns persian date of system