动态 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异常处理。
| 动态规则行为 | 特权套装 |
|---|---|
| 运行行为 | 如果动态准备的语句不是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 或角色(如果运行在可信环境中 )所拥有的一组特权的组合 |