Литералы типа INTERVAL в PL/SQL

Литералы типа INTERVAL сходны с литералами TIMESTAMP; они используются для вставки интервальных значений в виде констант в программный код. Литералы типа INTERVAL имеют следующий синтаксис: 

INTERVAL 'символьное_представление' начальный_элемент TO конечный_элемент

Здесь символьное_представление — символьная строка, представляющая интервал (описание представления двух типов интервалов в символьной форме приводится выше, в разделе «Преобразования интервалов»); начальный_элемент задает начальный элемент интервала, а конечный_элемент задает конечный элемент интервала.

В отличие от функций TO_YMINTERVAL и TO_DSINTERVAL, литералы INTERVAL позволяют задать интервал с использованием любой последовательности элементов даты/времени (см. табл. 10.2). Существует только два ограничения: элементы должны быть последовательными, и в одном интервале не допускается переход от месяцев к дням. Приведем несколько примеров: 

DECLARE
y2ma INTERVAL YEAR TO MONTH;
y2mb INTERVAL YEAR TO MONTH;
d2sa INTERVAL DAY TO SECOND;
d2sb INTERVAL DAY TO SECOND;
BEGIN
/* Несколько примеров интервалов YEAR TO MONTH */
y2ma := INTERVAL '40-3' YEAR TO MONTH;
y2mb := INTERVAL '40' YEAR;
/* Примеры интервалов DAY TO SECOND */
d2sa := INTERVAL '10 1:02:10.123' DAY TO SECOND;
/* Не работает в Oracle9i - 11gR2 из-за ошибки */
--d2sb := INTERVAL '1:02' HOUR TO MINUTE;
/* Два обходных способа задания интервала HOUR TO MINUTE,
представляющего только часть интервала DAY TO SECOND range. */
SELECT INTERVAL '1:02' HOUR TO MINUTE
INTO d2sb
FROM dual;
d2sb := INTERVAL '1' HOUR + INTERVAL '02' MINUTE;
END;

Начиная с Oracle9i и вплоть до Oracle11g Release 2, выражения вида INTERVAL '1:02' HOUR TO MINUTE, в которых не указывается значение каждого возможного элемента, могут использоваться в командах SQL, но не в командах PL/SQL. Более того, при выполнении программы будет выдано сообщение об использовании ключевого слова BULK в неверном контексте. По всей вероятности, эта ошибка будет исправлена в следующих выпусках продукта.

Oracle нормализует значения интервалов, что весьма удобно. В следующем примере 72 часа 15 минут преобразуются в 3 дня, 0 часов и 15 минут:

DECLARE
d2s INTERVAL DAY TO SECOND;
BEGIN
SELECT INTERVAL '72:15' HOUR TO MINUTE INTO d2s FROM DUAL;
DBMS_OUTPUT.PUT_LINE(d2s);
END;

Результат:

+03 00:15:00.000000 

Oracle почему-то нормализует только старшие значения (часы в данном примере). Попытка задать интервал 72:75 (72 часа и 75 минут) приведет к ошибке.

 

Вас заинтересует / Intresting for you:

Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 4651 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 14846 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Типы данных INTERVAL в PL/SQL:...
Типы данных INTERVAL в PL/SQL:... 23136 просмотров Doctor Sat, 19 Oct 2019, 10:56:26
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 12339 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Войдите чтобы комментировать