Есть в Oracle одна маленькая, почти медитативная штука — DUAL.
Таблица крошечная, а пользы в ней море. Хочешь быстро проверить выражение,
вызвать функцию, собрать тестовый SELECT,
подготовить константы для INSERT
или просто на лету что-то вычислить — она рядом.
Люблю этот инструмент за чистоту: ничего лишнего, только ты, выражение и результат.
Синтаксис
SELECT expression
FROM DUALВ Oracle DUAL обычно используют там, где нужно получить одно вычисленное значение
без обращения к пользовательским таблицам. Это особенно красиво в тестах,
диагностике, генерации дат, строк, идентификаторов и вызовах встроенных функций.
Где используют
- быстрые проверки выражений и встроенных функций
- формирование константных наборов через SELECT
- подготовка значений для INSERT
- генерация дат, времени, GUID, случайных чисел
- построение тестовых запросов без создания таблиц
100 примеров
1. Возврат простой константы
SELECT 'hello' AS greeting
FROM DUAL2. Числовое выражение без таблиц
SELECT 2 + 3 * 4 AS result
FROM DUAL3. Получение текущей даты
SELECT SYSDATE AS current_date
FROM DUAL4. Получение текущей временной метки
SELECT SYSTIMESTAMP AS current_ts
FROM DUAL5. Текущий пользователь сессии
SELECT USER AS current_user
FROM DUAL6. Форматирование даты через TO_CHAR
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') AS iso_date
FROM DUAL7. Парсинг строки в дату через TO_DATE
SELECT TO_DATE('2026-03-22','YYYY-MM-DD') AS dt
FROM DUAL8. Приведение строки к числу
SELECT TO_NUMBER('1500') AS num_val
FROM DUAL9. Склейка строк
SELECT 'Ora' || 'cle' AS full_word
FROM DUAL10. Верхний регистр через UPPER
SELECT UPPER('oracle sql') AS txt
FROM DUAL11. Нижний регистр через LOWER
SELECT LOWER('ORACLE SQL') AS txt
FROM DUAL12. Удаление пробелов по краям
SELECT TRIM(' data ') AS cleaned
FROM DUAL13. Длина строки
SELECT LENGTH('database') AS len
FROM DUAL14. Извлечение подстроки
SELECT SUBSTR('oracle',1,3) AS part
FROM DUAL15. Поиск позиции символа
SELECT INSTR('oracle sql','sql') AS pos
FROM DUAL16. Замена фрагмента строки
SELECT REPLACE('red,blue','blue','green') AS txt
FROM DUAL17. Округление числа
SELECT ROUND(15.678,2) AS rounded
FROM DUAL18. Усечение дробной части через TRUNC
SELECT TRUNC(15.678,1) AS truncated
FROM DUAL19. Модуль числа
SELECT ABS(-45) AS abs_val
FROM DUAL20. Степень числа
SELECT POWER(2,10) AS pow_val
FROM DUALЕще 20 примеров
21. Квадратный корень
SELECT SQRT(144) AS root_val
FROM DUAL22. Остаток от деления
SELECT MOD(17,5) AS remainder
FROM DUAL23. Выбор большего из двух значений
SELECT GREATEST(10,25,7) AS max_val
FROM DUAL24. Выбор меньшего из двух значений
SELECT LEAST(10,25,7) AS min_val
FROM DUAL25. Знак числа через SIGN
SELECT SIGN(-20) AS sign_val
FROM DUAL26. Возврат значения при NULL через NVL
SELECT NVL(NULL,'fallback') AS val
FROM DUAL27. Альтернатива через COALESCE
SELECT COALESCE(NULL,NULL,'ok') AS val
FROM DUAL28. Логика через CASE
SELECT CASE WHEN 5 > 3 THEN 'yes' ELSE 'no' END AS answer
FROM DUAL29. Короткий выбор через DECODE
SELECT DECODE(2,1,'one',2,'two','other') AS word
FROM DUAL30. Проверка регулярным выражением
SELECT REGEXP_LIKE('abc123','^[a-z0-9]+$') AS is_ok
FROM DUAL31. Извлечение по regexp
SELECT REGEXP_SUBSTR('id=55','[0-9]+') AS num_part
FROM DUAL32. Замена по regexp
SELECT REGEXP_REPLACE('abc-123','[^0-9]') AS only_digits
FROM DUAL33. Генерация GUID
SELECT SYS_GUID() AS guid_val
FROM DUAL34. Случайное число
SELECT DBMS_RANDOM.VALUE(1,100) AS rnd_val
FROM DUAL35. Случайное целое число
SELECT TRUNC(DBMS_RANDOM.VALUE(1,11)) AS rnd_int
FROM DUAL36. Следующее значение sequence
SELECT seq_orders.NEXTVAL AS next_id
FROM DUAL37. Текущее значение sequence
SELECT seq_orders.CURRVAL AS curr_id
FROM DUAL38. Прибавить день к текущей дате
SELECT SYSDATE + 1 AS tomorrow
FROM DUAL39. Разница в месяцах через MONTHS_BETWEEN
SELECT MONTHS_BETWEEN(DATE '2026-12-31',DATE '2026-01-01') AS diff_m
FROM DUAL40. Последний день месяца
SELECT LAST_DAY(SYSDATE) AS month_end
FROM DUALЕще 20 примеров
41. Первый день следующего месяца
SELECT TRUNC(ADD_MONTHS(SYSDATE,1),'MM') AS next_month_start
FROM DUAL42. Текущий год
SELECT EXTRACT(YEAR FROM SYSDATE) AS yyyy
FROM DUAL43. Текущий месяц
SELECT EXTRACT(MONTH FROM SYSDATE) AS mm
FROM DUAL44. День недели в текстовом виде
SELECT TO_CHAR(SYSDATE,'DAY') AS day_name
FROM DUAL45. День года
SELECT TO_CHAR(SYSDATE,'DDD') AS day_of_year
FROM DUAL46. ISO-неделя
SELECT TO_CHAR(SYSDATE,'IW') AS iso_week
FROM DUAL47. Unix-подобный timestamp в секундах
SELECT (SYSDATE - DATE '1970-01-01') * 86400 AS epoch_seconds
FROM DUAL48. Интервал из текста
SELECT TO_DSINTERVAL('0 01:30:00') AS ivl
FROM DUAL49. Прибавить интервал к timestamp
SELECT SYSTIMESTAMP + INTERVAL '2' HOUR AS plus_2h
FROM DUAL50. Обрезать дату до месяца
SELECT TRUNC(SYSDATE,'MM') AS month_start
FROM DUAL51. Обрезать дату до года
SELECT TRUNC(SYSDATE,'YYYY') AS year_start
FROM DUAL52. Форматирование числа как денег
SELECT TO_CHAR(12500.5,'999G999D00') AS money_txt
FROM DUAL53. Проверка условия через булев индикатор
SELECT CASE WHEN 10 BETWEEN 1 AND 20 THEN 1 ELSE 0 END AS ok_flag
FROM DUAL54. Конструирование JSON-объекта
SELECT JSON_OBJECT('id' VALUE 1,'name' VALUE 'Alice') AS json_doc
FROM DUAL55. Конструирование JSON-массива
SELECT JSON_ARRAY('red','green','blue') AS json_arr
FROM DUAL56. Разбор JSON-значения
SELECT JSON_VALUE('{"x":42}','$.x') AS x_val
FROM DUAL57. XML-конструирование
SELECT XMLELEMENT("tag",'value') AS xml_val
FROM DUAL58. Хэш строки
SELECT STANDARD_HASH('oracle','SHA256') AS hash_val
FROM DUAL59. Base64-представление текста
SELECT UTL_RAW.CAST_TO_VARCHAR2(
UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('hello'))
) AS b64
FROM DUAL60. URL-экранирование строки
SELECT UTL_URL.ESCAPE('a b+c') AS escaped
FROM DUALЕще 20 примеров
61. INSERT одной строки через вычисление
INSERT INTO audit_events(id,created_at)
SELECT 1001,SYSDATE
FROM DUAL62. INSERT с generated GUID
INSERT INTO docs(doc_id)
SELECT SYS_GUID()
FROM DUAL63. Вставка тестового пользователя
INSERT INTO users(user_id,email)
SELECT seq_orders.NEXTVAL,'demo@example.com'
FROM DUAL64. Многострочная константная выборка через UNION ALL
SELECT 1 AS id,'A' AS code FROM DUAL
UNION ALL
SELECT 2,'B' FROM DUAL
UNION ALL
SELECT 3,'C' FROM DUAL65. Карманный справочник статусов
SELECT 'NEW' AS status FROM DUAL
UNION ALL
SELECT 'PAID' FROM DUAL
UNION ALL
SELECT 'DONE' FROM DUAL66. Генерация чисел от 1 до 10 через CONNECT BY
SELECT LEVEL AS n
FROM DUAL
CONNECT BY LEVEL <= 1067. Генерация календаря на неделю
SELECT TRUNC(SYSDATE) + LEVEL - 1 AS dt
FROM DUAL
CONNECT BY LEVEL <= 768. Генерация часов суток
SELECT LEVEL - 1 AS hh
FROM DUAL
CONNECT BY LEVEL <= 2469. Генерация месяцев года
SELECT LEVEL AS mm
FROM DUAL
CONNECT BY LEVEL <= 1270. Серия букв через CHR
SELECT CHR(64 + LEVEL) AS letter
FROM DUAL
CONNECT BY LEVEL <= 571. Вспомогательная таблица умножения
SELECT LEVEL AS n, LEVEL * 7 AS x7
FROM DUAL
CONNECT BY LEVEL <= 1072. Генерация дат начала кварталов
SELECT ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),(LEVEL - 1) * 3) AS q_start
FROM DUAL
CONNECT BY LEVEL <= 473. Набор значений для IN-фильтра через subquery
SELECT code
FROM(
SELECT 'A' AS code FROM DUAL
UNION ALL
SELECT 'B' FROM DUAL
UNION ALL
SELECT 'C' FROM DUAL
)74. Проверка существования с EXISTS
SELECT CASE WHEN EXISTS (SELECT 1 FROM DUAL) THEN 'Y' ELSE 'N' END AS has_row
FROM DUAL75. Сравнение через ALL
SELECT CASE WHEN 10 > ALL(SELECT 3 FROM DUAL UNION ALL SELECT 5 FROM DUAL) THEN 'ok' ELSE 'fail' END AS res
FROM DUAL76. Сравнение через ANY
SELECT CASE WHEN 4 = ANY(SELECT 4 FROM DUAL UNION ALL SELECT 9 FROM DUAL) THEN 'ok' ELSE 'fail' END AS res
FROM DUAL77. Условная развилка на основе даты
SELECT CASE WHEN TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN') THEN 'weekend' ELSE 'weekday' END AS day_type
FROM DUAL78. Быстрый top-1 тест с FETCH
SELECT LEVEL AS n
FROM DUAL
CONNECT BY LEVEL <= 5
FETCH FIRST 1 ROW ONLY79. Серия случайных значений
SELECT TRUNC(DBMS_RANDOM.VALUE(100,999)) AS code
FROM DUAL
CONNECT BY LEVEL <= 580. Генерация тестовых email
SELECT 'user' || LEVEL || '@example.com' AS email
FROM DUAL
CONNECT BY LEVEL <= 5Еще 20 примеров
81. Вызов пользовательской функции
SELECT tax(1000) AS tax_val
FROM DUAL82. Вызов package-функции
SELECT pkg_util.now AS now_val
FROM DUAL83. Получение контекстного значения приложения
SELECT SYS_CONTEXT('USERENV','SESSION_USER') AS session_user
FROM DUAL84. Проверка схемы по умолчанию
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS current_schema
FROM DUAL85. Текущий SID/идентификатор сессии
SELECT SYS_CONTEXT('USERENV','SID') AS sid_val
FROM DUAL86. Хост клиента
SELECT SYS_CONTEXT('USERENV','HOST') AS host_name
FROM DUAL87. Имя инстанса
SELECT SYS_CONTEXT('USERENV','INSTANCE_NAME') AS inst_name
FROM DUAL88. Проверка timezone сессии
SELECT SESSIONTIMEZONE AS sess_tz
FROM DUAL89. Проверка timezone базы
SELECT DBTIMEZONE AS db_tz
FROM DUAL90. Текущая дата с timezone пользователя
SELECT CURRENT_DATE AS curr_dt
FROM DUAL91. Текущий timestamp пользователя
SELECT CURRENT_TIMESTAMP AS curr_ts
FROM DUAL92. Метка времени UTC
SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) AS utc_ts
FROM DUAL93. Проверка имени базы
SELECT SYS_CONTEXT('USERENV','DB_NAME') AS db_name
FROM DUAL94. Генерация slug из текста
SELECT LOWER(REPLACE(TRIM('Hello Oracle SQL'),' ','-')) AS slug_val
FROM DUAL95. Удаление HTML-тегов regexp-ом
SELECT REGEXP_REPLACE('<b>bold</b>','<[^>]+>') AS plain_txt
FROM DUAL96. Вычисление контрольной суммы строки
SELECT ORA_HASH('row-data') AS hash_num
FROM DUAL97. Нормализация телефона
SELECT REGEXP_REPLACE('+1 (555) 123-45-67','\D') AS phone_digits
FROM DUAL98. Быстрый pivot-like набор констант
SELECT 'Q1' AS q,100 AS amt FROM DUAL
UNION ALL
SELECT 'Q2',120 FROM DUAL
UNION ALL
SELECT 'Q3',140 FROM DUAL
UNION ALL
SELECT 'Q4',160 FROM DUAL99. Сборка тестового отчёта по месяцам
SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),LEVEL - 1),'YYYY-MM') AS ym
FROM DUAL
CONNECT BY LEVEL <= 12100. Финальный мини-генератор данных
SELECT LEVEL AS id,
'item-' || LEVEL AS code,
TRUNC(DBMS_RANDOM.VALUE(10,100)) AS qty
FROM DUAL
CONNECT BY LEVEL <= 10Заключение
DUAL — это одна из тех вещей, за которые Oracle хочется уважать ещё сильнее.
Очень маленький объект, но с огромным практическим весом. Он помогает думать быстрее,
проверять идеи без шума и собирать аккуратные тесты прямо в SQL.
Если ты по-настоящему дружишь с Oracle, то рано или поздно начинаешь использовать его почти интуитивно.
Официальная документация Oracle:
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Selecting-from-the-DUAL-Table.html