Sur la base de votre question précédente et des informations que vous avez publiées, voici comment j'ai compris la question :si vous avez accordé select
sur toute la table à n'importe quel utilisateur, alors il est capable de récupérer tous rangées de celui-ci. Vous devez restreindre davantage les valeurs.
Une option - puisque nous parlons de la fonction - est d'utiliser case
dans where
clause.
Voici un exemple.
Exemple de données :
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.
Fonction :
- il accepte le nom d'utilisateur comme paramètre (attention à la casse ! Dans mon exemple, tout est en minuscules. Dans votre, vous devrez peut-être utiliser
upper
fonction ou quelque chose comme ça) case
dit :sipar_user
est égal àsys
, laissez-le récupérer toutes les lignes. Sinon, ne récupère que les lignes dont la valeur de la colonne de nom est égale àpar_user
- renvoie le résultat
Donc :
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.
Essayons :
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>