【问题标题】:PL/SQL Record and Table Variables inchangedPL/SQL 记录和表变量已更改
【发布时间】:2018-06-27 00:53:14
【问题描述】:
我是 Oracle PL/SQL 的新手,我被要求修改一些代码。我一直在查看 oracle 文档,并认为我知道它在做什么,但想验证我的理解是否正确。
代码如下:
TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
v_closes_sc array_rec_type;
TYPE v_sc_type is TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;
sc_array v_sc_type;
这是我认为在这里声明的内容:
- TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
- 似乎正在使用 tblName 表中 id 列中的列类型声明一个集合。可以是数字或 UUID 等。
- v_closes_sc array_rec_type;
- 类型 v_sc_type 是 v_closes_sc%TYPE INDEX BY BINARY_INTEGER 的表;
- 正在使用先前为表创建模板的集合(记录)创建新类型。该表将包含一列 ID。
- sc_array v_sc_type;
【问题讨论】:
标签:
oracle
plsql
oracle12c
【解决方案1】:
记录不是集合,因此您的解释有些混乱。 From the docs(你可能已经看过了:
在集合中,内部组件始终具有相同的数据类型,称为元素。 ...要创建集合变量,您可以定义一个集合类型,然后创建该类型的变量,或者使用%TYPE。
在记录中,内部组件可以有不同的数据类型,称为字段。您可以通过名称访问记录变量的每个字段...要创建记录变量,您可以定义RECORD 类型,然后创建该类型的变量,或者使用%ROWTYPE 或%TYPE。
所以看看你说的:
这是我认为在这里声明的内容:
TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
这是一个记录,而不是一个集合。在这种情况下,它有一个名为gla_sub 的字段,它确实是使用tblName 表中的id 列的数据类型声明的。使用%type 意味着,在某种程度上,您不需要知道实际的数据类型是什么,并且如果发生更改,您可能不必更改代码(如果varchar2 列的大小是增加,例如)。
v_closes_sc array_rec_type;
正确 - 正在创建新创建类型的变量。
TYPE v_sc_type is TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;
这个是一个集合,特别是一个associative array。它是一个稀疏数组,其成员是上面声明的记录类型的实例,具有数字索引。也可以直接使用类型声明,如下:
TYPE v_sc_type is TABLE OF array_rec_type INDEX BY BINARY_INTEGER;
sc_array v_sc_type;
正确 - 正在为刚刚声明的表类型创建一个新变量。
拥有一个包含单个字段的记录类型似乎有点毫无意义,因为您可以拥有一个基于表列数据类型的集合。不过,您现有的代码将期待这种结构,因此更改它并不是一件容易的事。