आपके पिछले प्रश्न और आपके द्वारा पोस्ट की गई जानकारी के आधार पर, मैंने इस प्रश्न को कैसे समझा:यदि आपने select
दिया है किसी भी उपयोगकर्ता के लिए पूरी टेबल पर, तब वह सभी . लाने में सक्षम होता है इससे पंक्तियाँ। आपको मूल्यों को और प्रतिबंधित करना होगा।
एक विकल्प - जैसा कि हम फ़ंक्शन के बारे में बात कर रहे हैं - 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>