sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo devolver filas según el usuario de la base de datos y el contenido de la tabla?

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:si par_user es igual a sys , deja que obtenga todas las filas. De lo contrario, busque solo las filas cuyo valor de columna de nombre sea igual a par_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>