SQL-PL/SQL 接口程序中的记录

在 PL/SQL 程序中使用 SQL 的记录绑定

背景

PL/SQL RECORD 是一种数据类型,它对应模式级别表的一个行。当通过编程处理数据库表中的行,特别是读取一行(通过 SELECT UPDATE...RETURNING 或者 DELETE...RETURNING),并通过编程处理,然后以同样的形式记录(通过 INSERTUPDATE)在另一张表中时,它是可供使用的自然结构。通过用单个变量来代表一列的值,它具有这些优点……
  • 使用 mytable%rowtype
    ,声明是简洁的。
  • 通过使用 %rowtype,声明保证与相应的模式级别模板匹配,并不受模式级别表形式定义变化的影响。
  • 给出简洁而正确无误的符号并允许在执行参数传递时进行优化,记录变量可以用作过程或函数的形参和实参。
  • 而在本讨论中的特别相关性方面,SQL-PL/SQL 接口程序允许不显式地列出源/目标表列的语法,再次顾及到了具有更大程度模式独立性的强健代码。

Oracle9i 9.0.1 版的现状

如下表所示,在 SQL-PL/SQL 接口程序中使用记录受到了很大的限制。只有单行 SELECT 的情况支持该语法(但这种情况下静态 SQL 和本地动态 SQL 都支持)。因而以上所列的优点还不能实现。

9.2.0 版中消除的限制

9.2.0 版消除了大量的限制。现在为所有类型的 SELECT 都提供了完全的支持。

而且为所有静态 SQL 类型的 INSERTDELETEUPDATE 提供了支持(还有一些小的限制 — 参见下面的内容)。

9.2.0 版中保留的限制

  • 不支持任何结合 INSERTUPDATEDELETE 使用的 EXECUTE IMMEDIATE。(如上所述,只支持与 SELECT 结合使用。)换句话说,使用本地动态 SQL 的 DML 还不支持记录。
  • DELETEUPDATE...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 可以使它们全部运行并在之后进行清理。

示例导览表

What 静态 SQL 本动态 SQL
SELECT
- 单行 ok ok
- 多行、单行语法 ok ok
- 多行、批量语法 PLS-00597 @9.0.1

示范 LIMIT 子句
PLS-00597 @9.0.1

示范 LIMIT 子句
INSERT
- 单行 ORA-00906 @9.0.1 PLS-00457 @9.2.0
- 多行、批量语法 ORA-00906 @9.0.1

示范 SAVE EXCEPTIONS
PLS-00457 @9.2.0
DELETE with RETURNING
- 单行 ORA-00600 @9.0.1 PLS-00429 @9.2.0
- 多行、批量语法 PLS-00597 @9.0.1 PLS-00429 @9.2.0
UPDATE with RETURNING
- 单行 ORA-00600 @9.0.1 PLS-00429 @9.2.0
- 多行、批量语法 PLS-00597 @9.0.1 PLS-00429 @9.2.0
UPDATE ...SET ROW =
不需要使用 RETURNING,因为您在进行 SQL 之前已经拥有记录。
- 单行 ORA-00904 @9.0.1 PLS-00457 @9.2.0
- 多行、批量语法 PLS-00436 @9.2.0 PLS-00457 @9.2.0


Key
9.0.1 版支持
9.2.0版新增
9.2.0 版分支持
不支持,9.2.0 版或之前版本

Bryn Llewellyn,PL/SQL 产品经理,Oracle Corp
最新更新时间为 2002 年 5 月 7 日

寄送此页面
Printer View 打印机视图