Com base na sua pergunta anterior e nas informações que você postou, veja como entendi a pergunta:se você concedeu
select
em toda a tabela para qualquer usuário, então ele poderá buscar todos fileiras dele. Você tem que restringir ainda mais os valores. Uma opção - já que estamos falando da função - é usar
case
em where
cláusula. Aqui está um exemplo.
Dados de amostra:
SQL> create table rating as
2 select 1 id, 'sys' name, 4 score from dual union all
3 select 3, 'leo' , 3 from dual union all
4 select 6, 'scott' , 5 from dual union all
5 select 7, 'hr' , 2 from dual;
Table created.
Função:
- aceita nome de usuário como parâmetro (lembre-se de letras maiúsculas! No meu exemplo, tudo é minúsculo. No seu, talvez você tenha que usar
upper
função ou algo assim) case
diz:separ_user
é igual asys
, deixe-o buscar todas as linhas. Caso contrário, busque apenas linhas cujo valor da coluna de nome seja igual apar_user
- retorne o resultado
Então:
SQL> create or replace function f_rating (par_user in varchar2)
2 return number
3 is
4 retval number;
5 begin
6 select avg(score)
7 into retval
8 from rating
9 where name = case when par_user = 'sys' then name
10 else par_user
11 end;
12 return retval;
13 end;
14 /
Function created.
Vamos tentar:
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>