Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como retornar linhas com base no usuário do banco de dados e no conteúdo da tabela?


Com base na sua pergunta anterior e nas informações que você postou, veja como entendi a pergunta:se você concedeu select em toda a tabela para qualquer usuário, então ele poderá buscar todos fileiras dele. Você tem que restringir ainda mais os valores.

Uma opção - já que estamos falando da função - é usar case em where cláusula.

Aqui está um exemplo.

Dados de amostra:
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.

Função:
  • aceita nome de usuário como parâmetro (lembre-se de letras maiúsculas! No meu exemplo, tudo é minúsculo. No seu, talvez você tenha que usar upper função ou algo assim)
  • case diz:se par_user é igual a sys , deixe-o buscar todas as linhas. Caso contrário, busque apenas linhas cujo valor da coluna de nome seja igual a par_user
  • retorne o resultado

Então:
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.

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

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

SQL>