gpt4 book ai didi

sql - 如何从字典 View 中发现 Oracle 12c 关联数组的索引类型?

转载 作者:行者123 更新时间:2023-12-04 16:46:59 25 4
gpt4 key购买 nike

使用 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';

这个查询产生了类似的东西

enter image description here

...可以使用奇特的递归查询将其解析为有用的数据结构,以防万一表包含记录,而不是数字(例如 the one in this article for PL/SQL RECORD )。

然而,我在字典 View 中找不到的是对关联数组索引类型的正式引用,即 PLS_INTEGER .有什么办法可以从不同的角度发现这一点?

请注意,我想避免解析 ALL_IDENTIFIERS 的内容,因为我不能依赖 PLSCOPE_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';

产生期望的结果:

enter image description here

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

关于sql - 如何从字典 View 中发现 Oracle 12c 关联数组的索引类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42116679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com