Как отличить guish «нормальных сотрудников» от «менеджеров»? Там должна быть какая-то таблица, в которой это сказано. Поскольку код, который вы разместили в качестве комментариев (действительно, зачем вы это сделали? Не могли бы вы отредактировать вопрос и опубликовать правильно отформатированный код вместо этого нечитаемого беспорядка?), Предполагается, что уникальный идентификатор - это чей-то адрес электронной почты, который также используется как имя пользователя при входе в Apex эта таблица будет иметь пары [электронная почта + роль], например,
SQL> desc apex_roles
Name Null? Type
----------------------------------------- -------- ------------------------
E_MAIL VARCHAR2(15)
ROLE CHAR(1)
SQL> select * from apex_roles;
E_MAIL R
--------------- -
lf@gmail.com M --> M = manager
kamal@yahoo.com E
SQL>
. Теперь создайте функцию, которая сообщает, является ли кто-то менеджером. Пусть он вернет 1
, если это так, 0
, если это не так (почему не Boolean? Вы не можете использовать его в select
операторах).
SQL> create or replace function f_is_manager(par_app_user in varchar2)
2 return number
3 is
4 retval number := 0;
5 begin
6 select 1
7 into retval
8 from apex_roles
9 where e_mail = par_app_user
10 and role = 'M';
11
12 return retval;
13 exception
14 when no_data_found then
15 -- user isn't a manager
16 return retval;
17 end;
18 /
Function created.
SQL>
Теперь используйте эту функцию в where
пункт в отчете; предположим, что это таблица, содержащая данные, которые вы хотите отобразить:
SQL> select * from my_data;
E_MAIL JOB SAL
-------------------- --------- ----------
CLARK@gmail.com MANAGER 2450
KING@gmail.com PRESIDENT 5000
MILLER@gmail.com CLERK 1300
lf@gmail.com MANAGER 2200 --> manager in APEX_ROLES table
kamal@yahoo.com CLERK 1500
Что происходит, когда kamal запускает отчет? Этот пользователь видит только свои собственные данные:
SQL> select job, sal
2 from my_data
3 where e_mail = case when f_is_manager('&&APP_USER') = 1 then e_mail
4 else '&&APP_USER'
5 end;
Enter value for app_user: kamal@yahoo.com
JOB SAL
--------- ----------
CLERK 1500
Но если менеджер запускает его, он видит данные всех:
SQL> select job, sal
2 from my_data
3 where e_mail = case when f_is_manager('&&APP_USER') = 1 then e_mail
4 else '&&APP_USER'
5 end;
Enter value for app_user: lf@gmail.com
JOB SAL
--------- ----------
MANAGER 2450
PRESIDENT 5000
CLERK 1300
MANAGER 2200
CLERK 1500
SQL>
Поскольку это Apex, вы бы на самом деле используйте
select job, sal
from my_data
where e_mail = case when f_is_manager(:APP_USER) = 1 then e_mail
else ':APP_USER'
end;