我想通过类型属性或任何解决方法检索varray存储的元素类型。
例如我们的类型定义如下
CREATE TYPE "READINGS" AS VARRAY (200) OF NUMBER(21, 6);
(读数是varray,类型为number(21,6)
)
READINGS
是表INTERVALS
中的一列。 INTERVALS
是一个中心表,我们在INTERVALS
上有批处理进程,它们执行sql存储过程。在存储过程中,我们将硬编码变量声明映射到READING
VArray类型元素类型,即NUMBER(21, 6)
,例如存储过程具有变量声明,如
CONSUMPTION NUMBER(21, 6);
每当更改Varray定义或删除varray并以不同的大小和精度重新创建时,ex number(21,6)
更改为number(25,9)
我们需要更改所有批处理存储过程中的变量声明。
我正在寻找的是制作CONSUMPTION变量声明,请参考VArray的元素类型。我想要这样的东西
CONSUMPTION INTERVALS.READINGS.COLUMN_TYPE%TYPE;
(我想要这样的东西,参考varray存储的元素类型)
答案 0 :(得分:2)
为什么要首先创建一个包含VARRAY
列的表格?使用外键为READINGS
创建单独的表通常更有意义,该外键允许您将行关联回INTERVALS
表。然后,您可以轻松地声明READINGS.COLUMN_NAME%TYPE
类型的列。
集合在PL / SQL中非常有用。我从未见过他们在标准规范化数据建模方法上有所改进的情况。我已经看到多种情况,将集合合并到您的数据模型中最终会使您的数据模型更难以使用,并且您的代码更难以编写和维护。
如果您不想修复数据模型,可以
SUBTYPE
或类型NUMBER(21, 6)
的打包变量,用作变量声明的类型。如果更改VARRAY
类型的声明,则必须更改此定义。NUMBER(21,6)
)的对象类型,并根据该对象类型定义VARRAY
。然后,您可以在代码中声明对象类型的实例。答案 1 :(得分:0)
这不是必需的解决方案,但您可以获取字符串类型定义以便在动态SQL中进一步使用它
SELECT
regexp_substr(text, 'VARRAY.*?OF\s+(.+?)(;|\s)*$', 1, 1, 'i', 1)
FROM user_source
WHERE name = 'READINGS'