मेरे पास नीचे दिए गए कोड के साथ एक पैकेज विनिर्देश है

CURSOR my_cur   IS      
select ...;   

TYPE mytype IS TABLE OF my_cur%ROWTYPE;   

FUNCTION myfun       
RETURN mytype  PIPELINED; 

जब मैं पैकेज स्पेसिफिकॉन को संकलित करने का प्रयास करता हूं, तो मुझे निम्न त्रुटि मिलती है:

ORA-00600: आंतरिक त्रुटि कोड, तर्क: [psdmsc.c: उत्पन्न प्रकार अमान्य], [0x1ED93D3C10], [3], [], [], [], [], [], [], [], [], []

दिलचस्प बात यह है कि इस फ़ंक्शन वाले पैकेज का मुख्य भाग ठीक संकलित होता है।

मैंने सोचा था कि परिणामसेट समस्या पैदा कर सकता है लेकिन मेरे कर्सर में क्वेरी अधिकतम 1 पंक्ति पर लौटती है

1
Coding Duchess 30 जिंदा 2020, 17:54
और बिना पाइपलाइन के कार्य के कल्पना बिना किसी त्रुटि के संकलित करती है?
 – 
hotfix
30 जिंदा 2020, 19:29
हां। और अगर मैं पैकेज बॉडी में फंक्शन स्पेक और बॉडी दोनों डालता हूं तो सभी अच्छी तरह से संकलित होते हैं ...
 – 
Coding Duchess
30 जिंदा 2020, 19:58

2 जवाब

सबसे बढ़िया उत्तर

एक समस्या मिली - मेरी कर्सर क्वेरी में उपनामों में से एक आरक्षित कीवर्ड था। एस्केप वर्णों का उपयोग इसे आरक्षित कीवर्ड के रूप में देखे जाने से नहीं रोकता है। दिलचस्प बात यह थी कि क्वेरी अपने आप ठीक काम करती थी लेकिन फ़ंक्शन को संकलित करने से रोकती थी

0
Coding Duchess 31 जिंदा 2020, 18:11

यह समस्या डीबी के लिए इन संस्करण श्रेणी के भीतर पूरी की जा सकती है।

निम्न स्थितियों के मिलने पर my_cur%ROWTYPE की PL/SQL तालिका लौटाने वाले पाइपलाइन फ़ंक्शन को संकलित करने के कारण त्रुटि उत्पन्न हो सकती है:

  • कर्सर [या तालिका] my_cur my_cur%ROWTYPE में संदर्भित है जिसका स्वामित्व a . के पास है समारोह से अलग स्कीमा
  • एक और स्कीमा में एक और फ़ंक्शन है जिसमें असफल फ़ंक्शन के समान नाम होता है
  • यह other function उसी कर्सर [या तालिका] को संदर्भित करता है जो विफल फ़ंक्शन के रूप में है,
  • यह other function या तो उसी स्कीमा में है जिसमें कर्सर [या तालिका] है या किसी भिन्न में है।

वर्कअराउंड के लिए, sys [या सिस्टम] से कनेक्ट करें, और अमान्य स्थिति वाले ऑब्जेक्ट की जाँच करें

SQL> SELECT owner,object_name,status
  FROM dba_objects
 WHERE status = 'INVALID'
   AND object_type = 'TYPE'
   AND object_name LIKE 'SYS_PLSQL_%' 

OWNER OBJECT_NAME          STATUS
----- -------------------- --------
USER1 SYS_PLSQL_12345_2_1  INVALID   

फिर लौटाए गए प्रकार को संकलित करें

SQL> alter type USER1.SYS_PLSQL_12345_2_1 compile;
SQL> show error

किसी अन्य प्रकार के लिए PLS-00201 लौटा सकता है जैसे

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PL/SQL: Compilation unit analysis terminated
1/44 PLS-00201: identifier 'USER2.SYS_PLSQL_12346_7_1' must be declared 

फिर अमान्य प्रकार के स्वामी को निष्पादन विशेषाधिकार प्रदान करें

SQL> grant execute on USER2.SYS_PLSQL_12346_7_1 to USER1;

फिर अमान्य प्रकार को पुन: संकलित करें

SQL> alter type USER1.SYS_PLSQL_12345_2_1 compile;
SQL> show error

और उपरोक्त क्वेरी द्वारा अमान्य स्थिति वाली वस्तुओं को दोबारा जांचें, यदि कोई पंक्ति नहीं लौटाती है, तो संबंधित पैकेज सुरक्षित रूप से संकलित किया जा सकता है

SQL> alter package USER1.mypackage compile;     

संदर्भ। Oracle सपोर्ट से Doc ID 1185303.1

1
Barbaros Özhan 30 जिंदा 2020, 23:24
मेरे पास dba_objects तक पहुंच नहीं है। इसके अलावा, मुझे वह लेख मिला जिसका आप उल्लेख कर रहे हैं और सूचीबद्ध कोई भी मामला यहां फिट नहीं है।
 – 
Coding Duchess
31 जिंदा 2020, 15:53
दस्तावेज़ हमें बताता है कि अवैध प्रकार को संकलित करने के बाद, त्रुटि PLS-00201 उठाई जाती है। यह बग 8425548 ओआरए-00600 में वर्णित समस्या है [पीएसडीएमएससी.सी स्पॉनड टाइप इनवैलिड] जबकि कंपाइल पैकेज
 – 
Barbaros Özhan
31 जिंदा 2020, 18:37