मैं किसी अन्य टिप्पणी के बजाय उत्तर देने का प्रयास करूंगा।
जैसा कि मैंने एक टिप्पणी में कहा था, पीएल/एसक्यूएल में एक शुद्ध/सरल चयन-कथन काम नहीं करता है। लेकिन मैं यह कहने में गलत था कि रेफ कर्सर वापस करने के लिए आपको एक संग्रहीत फ़ंक्शन की आवश्यकता है।
लेकिन सबसे पहले चीज़ें:आपके पीएल/एसक्यूएल-ब्लॉक में घोषित "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 पक्ष पर ज्ञात/उपलब्ध नहीं है।