Según su pregunta anterior y la información que publicó, así es como entendí la pregunta:si concedió select
en toda la tabla a cualquier usuario, entonces puede obtener todos filas de él. Tienes que restringir aún más los valores.
Una opción, ya que estamos hablando de la función, es usar case
en where
cláusula.
He aquí un ejemplo.
Datos de muestra:
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.
Función:
- acepta el nombre de usuario como parámetro (¡cuidado con las mayúsculas! En mi ejemplo, todo está en minúsculas. En el tuyo, tal vez tengas que usar
upper
función o algo así) case
dice:sipar_user
es igual asys
, deja que obtenga todas las filas. De lo contrario, busque solo las filas cuyo valor de columna de nombre sea igual apar_user
- devolver el resultado
Entonces:
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.
Intentémoslo:
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>