动态 SQL 语句的准备和执行

您的应用程序可以动态构建一个以字符串形式放置在宿主变量中的SQL语句。 一般来说,语句是由应用程序可用的某些数据(例如,来自工作站的输入)构建的。

在非 Java™ 语言中,可以通过(嵌入式)语句 PREPARE 准备执行所构造的语句,并通过(嵌入式)语句 EXECUTE 执行所构造的语句,如使用 PREPARE 和 EXECUTE 动态执行 SQL 语句中所述。 或者,您可以使用(内嵌的)语句EXECUTE IMMEDIATE来一步完成语句的准备和执行。 在Java中,可以通过Statement、 PreparedStatement, 和 CallableStatement 类准备语句执行,并通过各自的execute()方法执行。

通过 Db2 for z/OS® ODBC ,还可以通过调用 SQLPrepare 函数来准备语句,然后通过调用 SQLExecute 函数来执行语句。 在这两种情况下,应用程序都不包含嵌入的PREPARE或EXECUTE语句。 您可以通过将语句传递给 SQLExecDirect 函数来执行语句,而无需进行准备工作。 Db2 简介 ODBC 介绍了该接口支持的 API。

将要准备的语句中不得包含对宿主变量的引用。 它也可以包含参数标记。 (有关参数标记的规则请参阅 PREPARE 语句描述中的参数标记。) 当执行准备好的语句时,参数标记实际上被EXECUTE语句中指定的宿主变量的当前值所取代。 (有关替换的规则,请参阅 EXECUTE语句。) 在准备就绪后,可以使用不同值的主变量多次执行语句。 在使用EXECUTE IMMEDIATE准备和执行的SQL语句中不允许使用参数标记。

在非Java语言中,语句执行成功与否由EXECUTE(或EXECUTE IMMEDIATE)语句后SQLCA中SQLCODE和SQLSTATE字段返回的值来表示。 您应该检查上述字段中是否有嵌入的语句。 在Java中,语句执行成功与否由Java异常处理。

正如授权 ID 和动态 SQL 中所述,DYNAMICRULES 行为实际上决定了在处理动态 SQL 语句时用于授权检查的权限集。 下表总结了这些特权集。 (请参阅授权ID和动态SQL ,了解用于确定行为生效的DYNAMICRULES绑定选项值的列表)。
表 1. DYNAMICRULES 行为和授权检查
动态规则行为 特权套装
运行行为 如果动态准备的语句不是ALTER、CREATE、DROP、GRANT、RENAME或REVOKE语句,则将流程中每个授权ID所拥有的一组特权进行合并。

如果动态SQL语句是CREATE、GRANT或REVOKE语句,则由进程的SQL授权ID或主要授权ID的角色(如果进程在用ROLE AS OBJECT OWNER子句定义的可信上下文中运行)持有的特权。

绑定行为 特权由套餐或计划所有者的主要授权ID持有。
定义行为 存储过程或用户定义函数所有者(定义者)的授权ID所拥有的特权。
调用行为 存储过程或用户定义函数调用者的授权ID所拥有的特权。 但是,如果调用者是该进程的主要授权ID或当前SQLID值,则也会检查次要授权ID,以确定是否需要它们进行所需授权。 因此,在这种情况下,特权集是每个授权ID 或角色(如果运行在可信环境中 )所拥有的一组特权的组合