Иногда возникает задача: сложить всё вместе, а показывать индивидуально.
Представим себе: у нас есть таблица, в которую мы складываем данные. Все данные. А показывать их должны селективно. Например, каждому пользователю только его данные. Было бы здорово, если бы мы могли добавить в таблицу новое поле, скажем, user_name, и создать представление вида
create view...
as
select...
from...
where user_name = :current_user_name
;
Но так не бывает. По определению синтаксиса представления.
Нет, конечно, Oracle предлагает нам конвейерные функции, но это потом - а вот представлением бы, вьюхой-то? Как? Нельзя? Совсем нельзя?
А если очень хочется?!!
Можно! В Oracle можно. За то и любим его. Но не совсем так, как навскидку кажется.
Пишем текст представления, как хотели, только вместо значения параметра (placeholder'а, бинда, переменной с двоеточием) ставим взятие значения пакетной функции:
create view... as select... from...
where user_name = my_pkg.get_current_user_name
;
Это означает, что если каким-то образом функция get_current_user_name вернет нам имя текущего пользователя, то наше представление станет динамическим фильтром!
(Это круто, но не забудьте сказать об этом службе Сопровождения, иначе возможны тяжкие ментальные повреждения.)
Но в том-то и дело, что предложенная функция является пакетной, ведь в пакете можно определить не только функции и процедуры, но и переменные, которые будут действительны в пределах сессии!
Определим в пакете my_pkg 3 объекта:
1. Переменную v_current_user_name;
2. Процедуру set_current_user_name установки значения этой переменной;
3. Уже названную функцию get_current_user_name для взятия текущего значения названной пакетной переменной.
Теперь, в начале нашего, скажем, PHP скрипта сначала вызываем процедуру и устанавливаем - в пределах сессии! - значение пакетной переменной. Затем читаем данные из представления, содержащего условие по взятию функцией текущего значения пакетной переменной для данной сессии.
Vu a la! Мы получили фильтрующее представление с динамическим параметром.
В одной из следующих статей я предполагаю обсудить то же самое действие, но с использованием т.н. контекста. Его, кстати, Oracle APEX устанавливает автоматически.