Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie werden Zeilen basierend auf dem Datenbankbenutzer und dem Inhalt der Tabelle zurückgegeben?

Basierend auf Ihrer vorherigen Frage und den von Ihnen geposteten Informationen habe ich die Frage folgendermaßen verstanden:Wenn Sie select gewährt haben auf der ganzen Tabelle an jeden Benutzer, dann ist es in der Lage, alle abzurufen Reihen daraus. Sie müssen die Werte weiter einschränken.

Eine Option – da wir über die Funktion sprechen – ist die Verwendung von case in where Klausel.

Hier ist ein Beispiel.

Beispieldaten:

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.

Funktion:

  • Es akzeptiert den Benutzernamen als Parameter (achten Sie auf Groß- und Kleinschreibung! In meinem Beispiel ist alles klein geschrieben. In Ihrem müssen Sie vielleicht upper verwenden Funktion oder so ähnlich)
  • case sagt:wenn par_user ist gleich sys , lassen Sie es alle Zeilen abrufen. Andernfalls nur Zeilen abrufen, deren Wert in der Namensspalte gleich par_user ist
  • das Ergebnis zurückgeben

Also:

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.

Versuchen wir es:

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

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

SQL>