【正确答案】批量动态SQL即在动态SQL中使用BULK子句,或使用游标变量时在FETCH中使用BULK,或在FORALL子句中使用BULK子句来实现。
如果一个循环内执行了INSERT、DELETE或UPDATE等语句引用了集合元素,那么可以将其移动到一个FORALL子句中。如果SELECT INTO、FETCH INTO或RETURNING INTO子句引用了一个集合,那么应该使用BULK COLLECT子句进行合并,从而来提高程序的性能。
(1)动态SQL中使用BULK子句的语法

使用BULK COLLECT INTO子句处理动态SQL中的多行查询可以加快处理速度,从而提高应用程序的性能。当使用BULK子句时,集合类型可以是PL/SQL所支持的索引表、嵌套表和VARRY,但集合元素必须使用SQL数据类型。常用的三种语句支持BULK子句,分别为EXECUTEIMMEDIATE,FETCH和FORALL。
(2)使用EXECUTE IMMEDIATE结合BULK子句处理DML语句返回子句下面的例子,首先定义了两个索引表类型以及其变量,接下来使用动态SQL语句来更新T_20170104_LHR的薪水,使用EXECUTE IMMEDIATE配合BULKCOLLECT INTO来处理结果集。

运行以上程序输出结果如下:

(3)使用EXECUTE IMMEDIATE结合BULK子句处理多行查询下面示例中,与前一个示例相同,只不过其动态SQL由查询语句组成,且返回多个结果集,同样使用了BULK COLLECT INTO来传递结果。

运行以上程序输出结果如下:

(4)使用FETCH子句结合BULK子句处理多行结果集 下面的示例中首先定义了游标类型、游标变量以及复合类型和复合变量,接下来从动态SQL中OPEN游标,然后使用FETCH将结果存放到复合变量中。即使用OPEN,FETCH代替了EXECUTE IMMEDIATE来完成动态SQL的执行。

运行以上程序输出结果如下:

(5)在FORALL子句中使用BULK子句下面是FORALL子句的语法:

FORALL子句允许为动态SQL输入变量,但FORALL子句仅支持DML(INSERT、DELETE、UPDATE)语句,不支持动态的SELECT语句。
在下面的示例中,首先声明了两个复合类型以及复合变量,接下来为复合变量ENAME_TABLE赋值,以形成动态SQL语句。紧接着使用FORALL子句结合EXECUTE IMMEDIATE来提取结果集。

运行以上程序输出结果如下:
