Oracle
 sql >> Database >  >> RDS >> Oracle

Esegui Immediato con tipo non SQL

Dipende da cosa intendi per "soluzione alternativa". Il tipo dovrà essere dichiarato a livello SQL, non all'interno di un blocco PL/SQL (presumibilmente un pacchetto in questo caso). Questo funzionerebbe, ad esempio:

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

In alternativa, puoi riconsiderare se hai davvero bisogno che questo sia dinamico. Presumibilmente stai passando o in qualche modo determinando la funzione da chiamare al volo e popolando v_function . Se c'è un elenco relativamente breve di possibili valori, potrebbe essere più semplice avere un case con singole chiamate di funzioni statiche.