在 PL/SQL 程序中使用 SQL 的记录绑定
背景
PL/SQL
RECORD 是一种数据类型,它对应模式级别表的一个行。当通过编程处理数据库表中的行,特别是读取一行(通过
SELECT,
UPDATE...RETURNING 或者
DELETE...RETURNING),并通过编程处理,然后以同样的形式记录(通过
INSERT 或
UPDATE)在另一张表中时,它是可供使用的自然结构。通过用单个变量来代表一列的值,它具有这些优点……
- 使用 mytable%rowtype
,声明是简洁的。
- 通过使用 %rowtype,声明保证与相应的模式级别模板匹配,并不受模式级别表形式定义变化的影响。
- 给出简洁而正确无误的符号并允许在执行参数传递时进行优化,记录变量可以用作过程或函数的形参和实参。
- 而在本讨论中的特别相关性方面,SQL-PL/SQL 接口程序允许不显式地列出源/目标表列的语法,再次顾及到了具有更大程度模式独立性的强健代码。
Oracle9i 9.0.1 版的现状
如下表所示,在 SQL-PL/SQL 接口程序中使用
记录受到了很大的限制。只有单行
SELECT 的情况支持该语法(但这种情况下静态 SQL 和本地动态 SQL 都支持)。因而以上所列的优点还不能实现。
9.2.0 版中消除的限制
9.2.0 版消除了大量的限制。现在为所有类型的
SELECT 都提供了完全的支持。
而且为所有静态 SQL 类型的 INSERT、DELETE 和 UPDATE 提供了支持(还有一些小的限制 — 参见下面的内容)。
9.2.0 版中保留的限制
- 不支持任何结合 INSERT、UPDATE 或 DELETE 使用的 EXECUTE IMMEDIATE。(如上所述,只支持与 SELECT 结合使用。)换句话说,使用本地动态 SQL 的 DML 还不支持记录。
- 与 DELETE 和 UPDATE...RETURNING 一起使用时,整个列必须用 SQL 语句显式编写。
- 在使用批量语法的情况下,不能在 SQL 语句中(特别是在 where 子句中)引用记录的内绑定表字段。
示例指南
这些示例依赖于
员工表。这是在
hr 模式下,该模式安装于 seed 数据库中。创建该模式的脚本是 Oracle Home 目录下的
demo/schema/human_resources/hr_cre.sql。
此 start.htm 文件和它所引用的所有文件 rec*.htm,都在 Oracle Home 目录下的 plsql/demo 目录中。首先运行 rectab.sql,然后运行 recpkg.sql,设置环境。然后您可以直接将代码示例从浏览器复制到 SQL*Plus 上。
有一批相应的纯文本文件 rec*.sql(仅在 plsql/demo 目录中),它们可以在 SQL*Plus 提示符下用 start 或 @ 来运行。文件 rec_all.sql 可以使它们全部运行并在之后进行清理。
示例导览表
| Key |
| 9.0.1 版支持 |
|
| 9.2.0版新增 |
|
| 9.2.0 版分支持 |
|
| 不支持,9.2.0 版或之前版本 |
|
Bryn Llewellyn,PL/SQL 产品经理,Oracle Corp
最新更新时间为 2002 年 5 月 7 日