2013-03-05 59 views
4

我想通过类型属性或任何解决方法检索varray存储元素的类型。使用TYPE属性检索VARRAY元素类型

例如我们的类型是这样

CREATE TYPE "READINGS" AS VARRAY (200) OF NUMBER(21, 6); 

定义(读数是与VARRAY number(21,6)类型的元素)

READINGS是表INTERVALS一列。 INTERVALS是一个中心表,我们在执行sql存储过程的INTERVALS上有批处理。在存储过程中,我们已经硬编码变量声明映射到其是NUMBER(21, 6)例如商店程序有变量声明等

CONSUMPTION NUMBER(21, 6); 

每当VARRAY定义被改变或VARRAY被丢弃,并且用不同的大小重新创建READING VARRAY类型元素类型和精度,而不是number(21,6)改为number(25,9)我们需要在所有批处理存储过程中更改我们的变量声明。 我要找的所有东西都在做CONSUMPTION变量声明,请参阅VArray的元素类型。我想是这样的

CONSUMPTION INTERVALS.READINGS.COLUMN_TYPE%TYPE; 

(我想这样一些事,指的是由VARRAY存储元素的类型)你为什么要创建一个表在首位VARRAY

回答

2

?通常使用外键为READINGS创建单独的表格可以让您将行关联回INTERVALS表。然后,您可以轻松地声明READINGS.COLUMN_NAME%TYPE类型的列。

集合在PL/SQL中非常有用。我从来没有见过这样的情况,他们改进了标准化的数据建模方法。我看到了多种情况,将集合并入您的数据模型最终导致您的数据模型难以使用,而且代码难以编写和维护。

如果你不想来修正数据模型,您可以

  • 声明一个SUBTYPE或您为您的变量声明中的类型使用NUMBER(21, 6)类型的包装变量。如果您更改VARRAY类型的声明,则必须更改此定义。
  • 创建一个具有单个属性的对象类型(一个NUMBER(21,6)),并根据该对象类型定义VARRAY。然后你可以在代码中声明对象类型的实例。
0

这不是必需的解决方案,但你可以定义类型的字符串动态SQL进一步使用它

SELECT 
    regexp_substr(text, 'VARRAY.*?OF\s+(.+?)(;|\s)*$', 1, 1, 'i', 1) 
FROM user_source 
WHERE name = 'READINGS'