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

ORA-14551:किसी क्वेरी के अंदर DML ऑपरेशन नहीं कर सकता

त्रुटि का अर्थ बिल्कुल स्पष्ट है:यदि हम किसी फ़ंक्शन को किसी सेलेक्ट स्टेटमेंट से कॉल करते हैं तो यह DML स्टेटमेंट को निष्पादित नहीं कर सकता है, यानी INSERT, UPDATE या DELETE, या वास्तव में DDL स्टेटमेंट उस पर आते हैं।

अब, आपके द्वारा पोस्ट किए गए कोड के स्निपेट में PIPE ROW के लिए एक कॉल है, तो स्पष्ट रूप से आप इसे SELECT * FROM TABLE() कह रहे हैं। लेकिन इसमें DELETE और INSERT स्टेटमेंट शामिल हैं, इसलिए स्पष्ट रूप से यह SELECT स्टेटमेंट में फंक्शन के लिए आवश्यक शुद्धता के स्तर के अनुरूप नहीं है।

तो, आपको उन डीएमएल स्टेटमेंट्स को हटाने की जरूरत है। आप उनका उपयोग वैश्विक अस्थायी तालिका को भरने के लिए कर रहे हैं, लेकिन यह अच्छी खबर है। आपने ऐसा कोई कोड शामिल नहीं किया है जो वास्तव में GTT का उपयोग करता है, इसलिए यह सुनिश्चित करना मुश्किल है, लेकिन GTT का उपयोग करना अक्सर अनावश्यक होता है। अधिक विवरण के साथ हम समाधान सुझा सकते हैं।

क्या यह आपका यह अन्य प्रश्न ? यदि हां, तो क्या आपने वह उत्तर जो मैंने इसी तरह के प्रश्न का दिया था ?

पूर्णता के लिए, DML और DDL स्टेटमेंट को SELECT स्टेटमेंट में बुलाए गए फ़ंक्शन में शामिल करना संभव है। समाधान AUTONOMOUS_TRANSACTION प्रज्ञा का उपयोग करना है। यह शायद ही कभी एक अच्छा विचार है, और निश्चित रूप से इस परिदृश्य में मदद नहीं करेगा। चूंकि लेन-देन स्वायत्त है, इसलिए इसके द्वारा किए गए परिवर्तन कॉलिंग लेनदेन के लिए अदृश्य हैं। इस मामले में मतलब यह है कि फ़ंक्शन GTT में विलोपन या सम्मिलन का परिणाम नहीं देख सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ग्रुप बाय के साथ अपडेट करें

  2. REMAINDER () Oracle में फंक्शन

  3. स्प्रिंग बूट 2.3.0 में नई त्रुटि। रिलीज:Oracle 12.2.0.1 jdbcdriver के लिए असंतुष्ट निर्भरता अपवाद लेकिन mysql jdbcdriver के साथ नहीं

  4. ट्रिगर के साथ डाला गया मान बदलें

  5. Oracle SQL - स्तंभ में पिवट तालिका पंक्तियाँ और पिवट में उप क्वेरी का उपयोग करें