Het hangt ervan af wat je met 'workaround' bedoelt. Het type zal op SQL-niveau gedeclareerd moeten worden, niet binnen een PL/SQL-blok (in dit geval vermoedelijk een pakket). Dit zou bijvoorbeeld werken:
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;
/
Als alternatief kun je heroverwegen of je dit echt nodig hebt om dynamisch te zijn. Vermoedelijk passeert of bepaalt u op de een of andere manier de functie die u onmiddellijk moet aanroepen en vult u v_function
in . Als er een relatief korte lijst met mogelijke waarden is, is het misschien eenvoudiger om een case
. te hebben met individuele statische functie-aanroepen.