Oracle
 sql >> Database >  >> RDS >> Oracle

Come restituire le righe in base all'utente del database e al contenuto della tabella?

Sulla base della tua domanda precedente e delle informazioni che hai pubblicato, ecco come ho capito la domanda:se hai concesso select sull'intera tabella a qualsiasi utente, quindi è in grado di recuperare tutto righe da esso. Devi limitare ulteriormente i valori.

Un'opzione - mentre stiamo parlando della funzione - è usare case in where clausola.

Ecco un esempio.

Dati di esempio:

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.

Funzione:

  • accetta nome utente come parametro (minuscolo maiuscolo! Nel mio esempio, tutto è minuscolo. Nel tuo, forse dovrai usare upper funzione o qualcosa del genere)
  • case dice:se par_user è uguale a sys , lascia che prenda tutte le righe. Altrimenti, recupera solo le righe il cui valore della colonna del nome è uguale a par_user
  • restituisci il risultato

Quindi:

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.

Proviamolo:

SQL> select f_rating('sys') rating_sys,
  2         f_rating('hr')  rating_hr
  3  from dual;

RATING_SYS  RATING_HR
---------- ----------
       3,5          2

SQL>