以前の質問と投稿した情報に基づいて、私が質問をどのように理解したかを次に示します。select
を許可した場合 テーブル全体で任意のユーザーに、すべてをフェッチできます それからの行。値をさらに制限する必要があります。
関数について話しているように、1つのオプションはcase
を使用することです。 where
条項。
これが例です。
サンプルデータ:
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.
機能:
- パラメータとしてユーザー名を受け入れます(大文字と小文字を区別します。私の例では、すべて小文字です。あなたの場合、おそらく
upper
を使用する必要があります。 関数またはそのようなもの) case
言う:par_user
の場合sys
と同じです 、すべての行をフェッチします。それ以外の場合は、名前列の値がpar_user
と等しい行のみをフェッチします。- 結果を返す
だから:
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.
試してみましょう:
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>