使用Oracle 12c,我有以下PL / SQL包
CREATE OR REPLACE PACKAGE x AS
TYPE t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
FUNCTION f RETURN t;
END x;
/
我现在想动态发现上述函数f
的返回类型:
SELECT *
FROM all_arguments
WHERE package_name = 'X';
此查询产生了与
类似的内容 ...可以使用花哨的递归查询将其解析为有用的数据结构,以防表中包含记录,而不是数字(例如the one in this article for PL/SQL RECORD
)。
然而,在词典视图中我找不到的是对关联数组的索引类型的正式引用,即PLS_INTEGER
。有没有办法在不同的视角中发现它?
注意,我想避免解析ALL_IDENTIFIERS
的内容,因为我不能依赖任何目标系统上的PLSCOPE_SETTINGS='IDENTIFIERS:ALL'
。
答案 0 :(得分:1)
请原谅我犯了罪:
WITH
FUNCTION index_type(type_owner VARCHAR2, type_name VARCHAR2, type_subname VARCHAR2)
RETURN VARCHAR2 IS
l_result VARCHAR2(50) := 'UNKNOWN';
BEGIN
EXECUTE IMMEDIATE q'[
DECLARE
l_result VARCHAR(50);
v "]' || type_owner || '"."' || type_name || '"."' || type_subname || q'[";
BEGIN
BEGIN
v('A') := NULL;
l_result := 'VARCHAR2';
EXCEPTION
WHEN OTHERS THEN
BEGIN
v(1) := NULL;
l_result := 'PLS_INTEGER';
EXCEPTION
WHEN OTHERS THEN l_result := 'UNKNOWN';
END;
END;
:result := l_result;
END;]' USING OUT l_result;
RETURN l_result;
EXCEPTION
WHEN OTHERS THEN RETURN SQLERRM;
END index_type;
SELECT
type_owner, type_name, type_subname,
index_type(type_owner, type_name, type_subname) AS index_type
FROM all_arguments
WHERE data_type = 'PL/SQL TABLE';
产生了预期的结果:
当然,类型定义需要更多细节,包括长度,精度等,但这对我来说已经足够了。