यह निर्भर करता है कि 'वर्कअराउंड' से आपका क्या मतलब है इस प्रकार को SQL स्तर पर घोषित करना होगा, पीएल/एसक्यूएल ब्लॉक के भीतर नहीं (संभवतः इस मामले में एक पैकेज)। यह काम करेगा, उदाहरण के लिए:
CREATE OR REPLACE TYPE t_error_msgs AS TABLE OF VARCHAR2(2000)
/
CREATE OR REPLACE PACKAGE p42 AS
FUNCTION handler RETURN t_error_msgs;
END p42;
/
CREATE OR REPLACE PACKAGE BODY p42 AS
FUNCTION handler RETURN t_error_msgs IS
BEGIN
RETURN null; -- put real data here, obviously...
END handler;
END p42;
/
DECLARE
v_error_msg t_error_msgs;
v_function varchar2(30);
BEGIN
v_function := 'p42.handler';
EXECUTE IMMEDIATE 'BEGIN :result := ' || v_function || '; END;'
USING OUT v_error_msg;
END;
/
वैकल्पिक रूप से आप पुनर्विचार कर सकते हैं कि गतिशील होने के लिए आपको वास्तव में इसकी आवश्यकता है या नहीं। संभवतः आप फ्लाई पर कॉल करने के लिए फ़ंक्शन को पास कर रहे हैं या किसी भी तरह से निर्धारित कर रहे हैं और v_function
पॉप्युलेट कर रहे हैं . यदि संभावित मानों की अपेक्षाकृत छोटी सूची है तो case
. होना आसान हो सकता है अलग-अलग स्थिर फ़ंक्शन कॉल के साथ।