17 сент. 2013 г.

Как в Oracle получить все значения поля в одной строке

Возможны следующие следующие варианты решения:

1. С помощью xmlagg:

with t as (
    select 1 as id, 'aaa' as str from dual union all
    select 2 as id, 'bbb' as str from dual union all
    select 3 as id, 'ccc' as str from dual
)
SELECT xmlagg(xmlelement("node", t.str, ', ')).extract('//text()').getStringVal() as result1
     , rtrim(xmlagg(xmlelement("node", t.str, ', ').extract('//text()')),', ') as result2
FROM t;


RESULT1              RESULT2
------------------   ------------------
aaa, bbb, ccc,       aaa, bbb, ccc

16 сент. 2013 г.

Пересечение периодов в Oracle

Первая ситуация - проверка перекрытия и вывод ошибки

Исходные данные: таблица some_table с ключевым полем key_field и датой действия периода (поля date_from и date_till)
Требования: при вставке записи в таблицу проверять пересечение нового периода с уже существующими в таблице, и в случае перекрытия выводить ошибку.
Реализация: создается триггер на таблицу

CREATE OR REPLACE TRIGGER some_table_aiu_trg
 AFTER
  INSERT OR UPDATE
 ON some_table
REFERENCING NEW AS NEW OLD AS OLD
DECLARE
   l_dummy varchar2(1);
   CURSOR  c_overlap
   IS
     SELECT 'x'
       FROM some_table t1, some_table t2
      WHERE t1.key_field = t2.key_field
        AND t1.date_from <= t2.date_till
        AND t1.date_till >= t2.date_from
        AND t1.date_till <> t2.date_till;
BEGIN

   -- Проверяем, нет ли перекрытия
   OPEN c_overlap;
   FETCH c_overlap INTO l_dummy;
      IF c_overlap%found THEN
         CLOSE c_overlap;
         raise_application_error(-20050,'Period overlap another period');
      END IF;
   CLOSE c_overlap;

END;
/