Dựa trên câu hỏi trước đó của bạn và thông tin bạn đã đăng, đây là cách tôi hiểu câu hỏi:nếu bạn đã cấp select
trên toàn bộ bảng cho bất kỳ người dùng nào, sau đó nó có thể tìm nạp tất cả hàng từ nó. Bạn phải hạn chế thêm các giá trị.
Một tùy chọn - như chúng ta đang nói về hàm - là sử dụng case
ở where
mệnh đề.
Đây là một ví dụ.
Dữ liệu mẫu:
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.
Chức năng:
- nó chấp nhận tên người dùng làm tham số (viết hoa tâm thư! Trong ví dụ của tôi, mọi thứ đều là chữ thường. Trong của bạn, có lẽ bạn sẽ phải sử dụng
upper
chức năng hoặc cái gì đó tương tự) -
case
nói:ifpar_user
bằng vớisys
, hãy để nó tìm nạp tất cả các hàng. Nếu không, chỉ tìm nạp các hàng có giá trị của cột tên bằngpar_user
- trả về kết quả
Vì vậy:
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.
Hãy thử nó:
SQL> select f_rating('sys') rating_sys,
2 f_rating('hr') rating_hr
3 from dual;
RATING_SYS RATING_HR
---------- ----------
3,5 2
SQL>