Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exécuter immédiatement avec un type non SQL

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.