Sql 如何从字典视图中发现Oracle 12c关联数组的索引类型?

Sql 如何从字典视图中发现Oracle 12c关联数组的索引类型?,sql,oracle,Sql,Oracle,使用Oracle12c,我有以下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'; 这个查询产生的结果大致如下: 。。。可以使用奇特的递归查询将其解析为有

使用Oracle12c,我有以下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';
这个查询产生的结果大致如下:

。。。可以使用奇特的递归查询将其解析为有用的数据结构,以防表包含记录,而不是数字(例如like)

然而,我在字典视图中找不到的是对关联数组的索引类型的正式引用,即
PLS\u INTEGER
。有没有办法从另一个角度来发现这一点


注意,我希望避免解析
所有标识符的内容,因为我不能在任何目标系统上依赖
PLSCOPE\u SETTINGS='IDENTIFIERS:ALL'

请原谅我的过错:

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';
这将产生所需的结果:

当然,类型定义需要更多细节,包括长度、精度等,但这对我来说已经足够好了