Найти в Дзене
Oracle APEX

Печеньки от Oracle. Представление с параметром

Иногда возникает задача: сложить всё вместе, а показывать индивидуально.

Представим себе: у нас есть таблица, в которую мы складываем данные. Все данные. А показывать их должны селективно. Например, каждому пользователю только его данные. Было бы здорово, если бы мы могли добавить в таблицу новое поле, скажем, 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 устанавливает автоматически.