Зависи какво имате предвид под „заобиколно решение“. Типът ще трябва да бъде деклариран на ниво SQL, а не в рамките на PL/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
с отделни извиквания на статични функции.