4

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

例如我们的类型是这样定义的

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

(读数是带有类型元素的可变数组number(21,6)

READINGS是表中的一列INTERVALS。是一个中央表,我们有执行 sql 存储过程INTERVALS的批处理。INTERVALS在存储过程中,我们有硬编码的变量声明映射到READINGVArray 类型元素类型,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存储的元素类型)

4

2 回答 2

2

你为什么要首先创建一个带有VARRAY列的表?使用外键创建一个单独的表通常更有意义,READINGS该外键可让您将行与INTERVALS表相关联。然后,您可以轻松地声明 type 的列READINGS.COLUMN_NAME%TYPE

集合在 PL/SQL 中非常有用。我从未见过他们改进数据建模的标准规范化方法的案例。我见过多种情况,其中将集合合并到您的数据模型中最终会使您的数据模型更难使用,并且您的代码更难编写和维护。

如果您不想修复数据模型,您可以

  • 声明一个SUBTYPE或一个类型的打包变量,NUMBER(21, 6)用作变量声明的类型。如果更改VARRAY类型的声明,则必须更改此定义。
  • 创建具有单个属性 (a NUMBER(21,6)) 的对象类型并VARRAY基于该对象类型定义。然后,您可以在代码中声明对象类型的实例。
于 2013-03-05T16:40:20.140 回答
0

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

SELECT 
   regexp_substr(text, 'VARRAY.*?OF\s+(.+?)(;|\s)*$', 1, 1, 'i', 1) 
FROM user_source 
WHERE name = 'READINGS'
于 2013-03-05T17:07:28.830 回答