DB2 10.5 for Linux, UNIX, and Windows

SQL 数据访问级别强制

例程(存储过程或用户定义的函数)能够执行 SQL 语句的程度由该例程的 SQL访问级别确定。

存在以下四个 SQL 数据访问级别:
  • NO SQL
  • CONTAINS SQL
  • READS SQL DATA
  • MODIFIES SQL DATA

缺省情况下,在编译时,SQL PL 和 PL/SQL 例程会强制执行数据访问级别。如果某个例程包含的 SQL 语句要求数据访问级别超过该例程,那么在您创建该例程时会返回错误。同样,如果某个例程调用的另一个例程的数据访问级别超过该调用例程,那么在您创建第一个例程时会返回错误。此外,如果将已编译用户定义的函数定义为 MODIFIES SQL DATA,那么只能将它用作复合 SQL(编译)语句内赋值语句右边的独占元素。编译该语句时,也会执行此检查。

从 V9.7 FP3 开始,通过设置 DB2_COMPATIBILITY_VECTOR 注册表变量,可使 SQL PL 和 PL/SQL 例程强制执行运行时而不是编译时的数据访问级别。要启用此支持,请将该注册表变量设置为十六进制值 0x10000(位位置 17),然后停止并重新启动该实例以使新设置生效。
db2set DB2_COMPATIBILITY_VECTOR=10000
   db2stop
   db2start
要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。

在运行时在语句级别执行此强制操作。当执行了超出当前 SQL 数据访问级别的语句时,会返回错误。如果例程调用了使用更严格 SQL 数据访问级别定义的另一例程,那么被调用例程会继承其父级的数据访问级别。此外,如果将已编译用户定义的函数定义为 MODIFIES SQL DATA,并且它不是复合 SQL(编译)语句内赋值语句右边的独占元素,那么仅当该函数发出用于修改 SQL 数据的 SQL 语句时,才会返回错误。

另外,从 V9.7 FP6 开始,在已使用 CREATE FUNCTION 语句中 MODIFIES SQL DATA 子句定义的以下函数中,允许使用 COMMIT 和 ROLLBACK 语句:已编译 PL/SQL 用户定义的函数和已编译语言 SQL 用户定义的函数。