Nó phụ thuộc vào ý bạn muốn nói về 'giải pháp thay thế' Kiểu sẽ phải được khai báo ở mức SQL, không phải trong một khối PL / SQL (có lẽ là một gói trong trường hợp này). Điều này sẽ hoạt động, ví dụ:
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;
/
Ngoài ra, bạn có thể xem xét lại liệu bạn có thực sự cần điều này để trở nên năng động hay không. Có lẽ bạn đang chuyển hoặc bằng cách nào đó đang xác định hàm để gọi khi đang di chuyển và điền v_function
. Nếu có một danh sách tương đối ngắn các giá trị có thể có thì có thể đơn giản hơn nếu có case
với các lệnh gọi hàm tĩnh riêng lẻ.