Cela dépend de ce que vous entendez par "contournement". Le type devra être déclaré au niveau SQL, et non dans un bloc PL/SQL (vraisemblablement un package dans ce cas). Cela fonctionnerait, par exemple :
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;
/
Alternativement, vous pouvez reconsidérer si vous avez vraiment besoin que cela soit dynamique. Vraisemblablement, vous passez ou déterminez d'une manière ou d'une autre la fonction à appeler à la volée et remplissez v_function
. S'il y a une liste relativement courte de valeurs possibles, il peut être plus simple d'avoir un case
avec des appels de fonction statiques individuels.