首页 > 解决方案 > PL/SQL 记录和表变量已更改

问题描述

我是 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;

这是我认为在这里宣布的内容:

标签: oracleplsqloracle12c

解决方案


记录不是集合,因此您的解释有些混乱。从文档(您可能已经看过:

集合中,内部组件始终具有相同的数据类型,称为元素。...要创建集合变量,您可以定义一个集合类型,然后创建该类型的变量,或者使用%TYPE.

在一条记录中,内部组件可以有不同的数据类型,称为字段。您可以通过名称访问记录变量的每个字段...要创建记录变量,您可以定义一个RECORD类型,然后创建该类型的变量,或者使用%ROWTYPEor %TYPE

所以看看你说的:

这是我认为在这里宣布的内容:

TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);

这是记录,不是收藏。在这种情况下,它有一个名为的字段gla_sub,它确实是使用表中id列的数据类型声明的tblName。的使用%type意味着,在某种程度上,您不需要知道数据类型实际上是什么,并且如果发生更改(varchar2例如,如果列的大小增加),您可能不必更改代码。

v_closes_sc array_rec_type;

正确 - 正在创建新创建类型的变量。

TYPE v_sc_type is TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;

一个集合,特别是关联数组。它是一个稀疏数组,其成员是上面声明的记录类型的实例,具有数字索引。这也可以直接使用类型声明,如:

TYPE v_sc_type is TABLE OF array_rec_type INDEX BY BINARY_INTEGER;
sc_array v_sc_type;

正确 - 正在创建一个刚刚声明的表类型的新变量。


具有单个字段的记录类型似乎有点毫无意义,因为您可以拥有基于表列数据类型的集合。不过,您现有的代码将期待这种结构,因此更改它并不是一件容易的事。


推荐阅读