Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Sofort mit Nicht-Sql-Typ ausführen

Es hängt davon ab, was Sie mit "Workaround" meinen. Der Typ muss auf SQL-Ebene deklariert werden, nicht innerhalb eines PL/SQL-Blocks (in diesem Fall vermutlich ein Paket). Dies würde zum Beispiel funktionieren:

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;
/

Alternativ können Sie noch einmal überdenken, ob Sie dies wirklich benötigen, um dynamisch zu sein. Vermutlich übergeben oder bestimmen Sie irgendwie die Funktion, die im laufenden Betrieb aufgerufen werden soll, und füllen v_function . Wenn es eine relativ kurze Liste möglicher Werte gibt, ist es möglicherweise einfacher, einen case zu verwenden mit einzelnen statischen Funktionsaufrufen.