Baseret på dit tidligere spørgsmål og de oplysninger, du postede, er det sådan, jeg forstod spørgsmålet:hvis du gav select
på hele bordet til enhver bruger, så er den i stand til at hente alle rækker fra den. Du er nødt til at begrænse værdierne yderligere.
En mulighed - som vi taler om funktionen - er at bruge case
i where
klausul.
Her er et eksempel.
Eksempeldata:
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:
- det accepterer brugernavn som en parameter (husk på bogstaver! I mit eksempel er alt små bogstaver. I dit, bliver du måske nødt til at bruge
upper
funktion eller sådan noget) case
siger:ifpar_user
er lig medsys
, lad den hente alle rækker. Ellers skal du kun hente rækker, hvis navnekolonnes værdi er lig medpar_user
- returner resultatet
Så:
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.
Lad os prøve det:
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>