使用TYPE属性检索VARRAY元素类型

时间:2013-03-05 14:44:58

标签: oracle plsql

我想通过类型属性或任何解决方法检索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存储的元素类型)

2 个答案:

答案 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'