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

कैसे एक संग्रहीत समारोह या प्रक्रिया का उपयोग किए बिना, एक रिटर्न वैल्यू पैरामीटर के रूप में सी # ODP.NET से एक Oracle रेफ कर्सर का उपयोग करने के लिए?

मैं किसी अन्य टिप्पणी के बजाय उत्तर देने का प्रयास करूंगा।

जैसा कि मैंने एक टिप्पणी में कहा था, पीएल/एसक्यूएल में एक शुद्ध/सरल चयन-कथन काम नहीं करता है। लेकिन मैं यह कहने में गलत था कि रेफ कर्सर वापस करने के लिए आपको एक संग्रहीत फ़ंक्शन की आवश्यकता है।

लेकिन सबसे पहले चीज़ें:आपके पीएल/एसक्यूएल-ब्लॉक में घोषित "id_array" प्रकार एक पीएल/एसक्यूएल प्रकार है। इसका उपयोग रेफ कर्सर चयन कथन में नहीं किया जा सकता है। इसके बजाय आपको एक SQL प्रकार की आवश्यकता होगी:

create type id_array as table of number;

इसे "तालिका बनाएं" की तरह केवल एक बार निष्पादित करने की आवश्यकता है।

तब आपका पीएल/एसक्यूएल-ब्लॉक इस तरह दिख सकता है:

DECLARE
    t_ids   id_array;
BEGIN
    UPDATE WorkerStatus
    SET
         StateId = :StateId
        ,StateReasonId = :StateReasonId
    WHERE
        StateId = :CurrentStateId
    RETURNING Id BULK COLLECT INTO t_Ids;

    OPEN :rcursor FOR SELECT * FROM TABLE(cast(t_Ids as id_array));    
END;

पुनश्च:
इस पोस्ट को असेंबल करते समय, मुझे एहसास हुआ कि ORA-00942 कहां से आ सकता है। सरणी t_ids एक PL/SQL प्रकार पर आधारित थी, जो SQL पक्ष पर ज्ञात/उपलब्ध नहीं है।




  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 में listagg का विकल्प?

  2. Oracle (ORA-02270):इस स्तंभ-सूची त्रुटि के लिए कोई अद्वितीय या प्राथमिक कुंजी से मेल नहीं खाता

  3. केवल समय कैसे स्टोर करें; तारीख और समय नहीं?

  4. ORA-29280 कैसे हल करें:अमान्य निर्देशिका पथ

  5. Oracle पैकेज अमान्य होने के लिए किन स्थितियों का कारण बनता है?