Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment renvoyer des lignes en fonction de l'utilisateur de la base de données et du contenu de la table ?

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 :si par_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>