Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / trigger before select / 3 сообщений из 3, страница 1 из 1
15.09.2017, 13:41
    #39521833
seivgard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
trigger before select
Доброго времени дни.

Предыстория: появилась необходимость создать view при обращении к которой будет происходить обновление агрегирующей таблицы, из которой и происходит выборка.
Поскольку в oracle (11g2) нет триггеров на before select постарался решить задачу следующем образом:
1. Есть агрегирующая таблица, например такая:
Код: plsql
1.
2.
3.
4.
create table TMP$TEST_1(
    id number,
    dt varchar2(100)
)


С данными:
Код: sql
1.
2.
insert into TMP$TEST_1(ID,DT)
values(1,'1')


2. Есть функция, которая наполняет данную таблицу данными:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace function TMP$TEST_FUN(ret varchar2)
return varchar2 as
    pragma autonomous_transaction;
    var number := 0;
begin
    select max(ID) + 1 into var from TMP$TEST_1;
    insert into TMP$TEST_1(ID,DT)
    values(var,to_char(var));
    commit;
    return ret;
end;


3. Есть представление, при обращении к которому вызывается функция и выборка из агрегирующей таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
create view TMP$TEST_VIEW_1 as
select ID,DT from (
    select 'ID' as ID,TMP$TEST_FUN('DT') as DT from dual
    union all
    select to_char(ID),DT from TMP$TEST_1
)



Но теперь самое интересное:
1. Выборка из таблицы возвращает следующие данные:
Код: sql
1.
2.
3.
 ID     DT    
 -----  ----- 
 1      1     


2. Запрос к представлению, возвращает те же данные и строку, содержащую результат выполнения функции:
Код: sql
1.
2.
3.
4.
 ID     DT    
 -----  ----- 
 ID     DT    
 1      1    



Но таблица уже содержит ещё одну строку с данными, добавленную при выполнении функции:
Код: sql
1.
2.
3.
4.
 ID     DT    
 -----  ----- 
 2      2     
 1      1   



Вопрос: Возможно ли реализовать представление так, чтобы выборка из агрегирующей таблицы при запросе к представлению уже содержала данные, добавленные при при вызове функции, так же вызванной при запросе к представлению?

Т.е. что бы при данных в агрегирующей таблице:
Код: sql
1.
2.
3.
 ID     DT    
 -----  ----- 
 1      1     



Результат обращения к представлению был:
Код: sql
1.
2.
3.
4.
5.
 ID     DT    
 -----  ----- 
 ID     DT    
 2      2     
 1      1 
...
Рейтинг: 0 / 0
15.09.2017, 13:47
    #39521846
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
trigger before select
Жесть.
Посмотрите лучше на конвейерные функции.
...
Рейтинг: 0 / 0
15.09.2017, 13:51
    #39521850
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
trigger before select
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / trigger before select / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]