c1
घोषित करने की कोई आवश्यकता नहीं है कमजोर टाइप किए गए रेफ कर्सर के लिए टाइप करें। आप बसSYS_REFCURSOR
. का उपयोग कर सकते हैं टाइप करें।- आप इस तरह से निहित और स्पष्ट कर्सर कॉल को मिश्रित नहीं कर सकते। अगर आप
OPEN
. पर जा रहे हैं एक कर्सर, आपकोFETCH
करना होगा इसमें से एक लूप में और आपकोCLOSE
. करना होगा यह। आपOPEN
नहीं कर सकते औरCLOSE
यह लेकिन फिर इसे एक निहित कर्सर लूप में प्राप्त करें। - डेटा लाने के लिए आपको एक वैरिएबल (या वेरिएबल) घोषित करना होगा। मैंने एक रिकॉर्ड प्रकार और उस रिकॉर्ड का एक उदाहरण घोषित किया है लेकिन आप आसानी से दो स्थानीय चर और
FETCH
घोषित कर सकते हैं उन चरों में। ROWID
एक आरक्षित शब्द है इसलिए मैंनेROWPOS
. का उपयोग किया इसके बजाय।
इसे एक साथ रखकर, आप कुछ इस तरह लिख सकते हैं
SQL> ed
Wrote file afiedt.buf
1 CREATE OR REPLACE Function Findposition (
2 model_in IN varchar2,
3 model_id IN number)
4 RETURN number
5 IS
6 cnumber number;
7 c2 sys_refcursor;
8 type result_rec is record (
9 id number,
10 rowpos number
11 );
12 l_result_rec result_rec;
13 BEGIN
14 open c2 FOR 'SELECT id,ROW_NUMBER() OVER ( ORDER BY id) AS rowpos FROM '||model_in;
15 loop
16 fetch c2 into l_result_rec;
17 exit when c2%notfound;
18 IF l_result_rec.id=model_id
19 then
20 cnumber :=l_result_rec.rowpos;
21 end if;
22 END LOOP;
23 close c2;
24 RETURN cnumber;
25* END;
SQL> /
Function created.
मेरा मानना है कि यह आपको अपेक्षित परिणाम देता है
SQL> create table foo( id number );
Table created.
SQL> insert into foo
2 select level * 2
3 from dual
4 connect by level <= 10;
10 rows created.
SQL> select findposition( 'FOO', 8 )
2 from dual;
FINDPOSITION('FOO',8)
---------------------
4
ध्यान दें कि एक दक्षता के दृष्टिकोण से, आप कर्सर को खोलने और हर बार तालिका से प्रत्येक पंक्ति को लाने के बजाय इसे एकल SQL कथन के रूप में लिखने से बहुत बेहतर होंगे। यदि आप एक कर्सर का उपयोग करने के लिए दृढ़ हैं, तो तालिका से प्रत्येक पंक्ति को प्राप्त करना जारी रखने के बजाय आपको अपनी रुचि की पंक्ति मिल जाने पर आप कर्सर से बाहर निकलना चाहेंगे।
एक कोड स्पष्टता के दृष्टिकोण से, आपके कई चर नाम और डेटा प्रकार बल्कि अजीब लगते हैं। आपके पैरामीटर नाम खराब चुने हुए लगते हैं-- मैं model_in
. की अपेक्षा नहीं करूंगा उदाहरण के लिए, इनपुट तालिका का नाम होना। c2
. नामक कर्सर घोषित करना भी समस्याग्रस्त है क्योंकि यह बहुत गैर-वर्णनात्मक है।