Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

गतिशील तालिका नाम का उपयोग करते हुए ओरेकल फ़ंक्शन और कर्सर

  • 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 . नामक कर्सर घोषित करना भी समस्याग्रस्त है क्योंकि यह बहुत गैर-वर्णनात्मक है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle की DMS क्लास फ़ाइलें कहाँ हैं?

  2. Oracle में एक ही तालिका में पंक्तियों के बीच तुलना करना

  3. एक वैश्विक ट्रिगर बनाना जो कई तालिकाओं को सुनता है

  4. SQL रिपोर्टिंग के साथ Oracle समस्या

  5. Oracle 10g में लेफ्ट जॉइन के साथ डिलीट करें