oracle - 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;
这是我认为在这里宣布的内容:
- TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
- 看起来正在使用 tblName 表中 id 列中的列类型声明一个集合。可以是数字或 UUID 等。
- v_closes_sc array_rec_type;
- 正在创建新创建类型的变量
- TYPE v_sc_type 是 TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;
- 正在使用先前为表创建模板的集合(记录)创建新类型。该表将有一个 ID 列。
- sc_array v_sc_type;
- 正在创建一个新变量来保存新的表变量。
解决方案
记录不是集合,因此您的解释有些混乱。从文档(您可能已经看过:
在集合中,内部组件始终具有相同的数据类型,称为元素。...要创建集合变量,您可以定义一个集合类型,然后创建该类型的变量,或者使用
%TYPE
.在一条记录中,内部组件可以有不同的数据类型,称为字段。您可以通过名称访问记录变量的每个字段...要创建记录变量,您可以定义一个
RECORD
类型,然后创建该类型的变量,或者使用%ROWTYPE
or%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;
正确 - 正在创建一个刚刚声明的表类型的新变量。
具有单个字段的记录类型似乎有点毫无意义,因为您可以拥有基于表列数据类型的集合。不过,您现有的代码将期待这种结构,因此更改它并不是一件容易的事。
推荐阅读
- php - 属性存在但“此集合实例上不存在”。发生
- c# - 图像 TapGestureRecognizer 未在 Xamarin 中触发
- javascript - 如何在不注入任何额外代码的情况下从外部 JavaScript 代码更改反应组件状态值?
- excel - 如果所有列值都为零,则删除电子表格中的行
- java - 使用 ReentrantReadWriteLock 时这是死锁吗?
- javascript - 尝试将 Font-Awesome 图标添加到我的导航栏中的选项卡
- c# - 为什么我的 .NET Web API 应用程序在使用 docker-compose 时无法连接到 docker 上的 MySQL?
- android - 在核心模块中启用 Android 数据绑定不起作用
- c# - 在每次构建时在 Visual Studio C# 中运行预构建事件,而不总是触发目标重新构建
- asp.net-core - 将 Asp Net Core Web API 项目添加到 MVC 项目