18 окт. 2013 г.
17 сент. 2013 г.
Как в Oracle получить все значения поля в одной строке
Возможны следующие следующие варианты решения:
1. С помощью xmlagg:
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)
Требования: при вставке записи в таблицу проверять пересечение нового периода с уже существующими в таблице, и в случае перекрытия выводить ошибку.
Реализация: создается триггер на таблицу
Исходные данные: таблица 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; /
Подписаться на:
Сообщения (Atom)