Вставляя несколько строк, что делает оператор "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
? Для чего он предназначен?
Ответы
Ответ 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