Forall插入动态sql

时间:2017-12-13 10:13:15

标签: sql oracle plsql

我有一组存储在表类型变量(varchar2)中的insert命令。记录将插入到同一个表的相同列中。

如何编写forall循环来执行这些插入查询?

由于

1 个答案:

答案 0 :(得分:0)

您可以循环嵌套表,如以下示例所示(来自PL/SQL Collections and Records - Nested Tables

declare
    type table_varchar is table of varchar2(4000);
    tv_inserts table_varchar := table_varchar();
begin
    tv_inserts.extend();
    tv_inserts(tv_inserts.count) := 'insert into test_table(col1, col2) values(1, 10)';
    tv_inserts.extend();
    tv_inserts(tv_inserts.count) := 'insert into test_table(col1, col2) values(2, 20)';
    tv_inserts.extend();
    tv_inserts(tv_inserts.count) := 'insert into test_table(col1, col2) values(3, 30)';

    for ind in tv_inserts.first..tv_inserts.last
    loop
        execute immediate tv_inserts(ind);
    end loop;
end;

您可以通过execute immediate构造运行动态创建的查询。

这样说,您可以使用以下示例代码解决您的问题。

declare
    type table_varchar is table of varchar2(4000);
    tv_inserts table_varchar := table_varchar();
begin
    tv_inserts.extend();
    tv_inserts(tv_inserts.count) := '1';
    tv_inserts.extend();
    tv_inserts(tv_inserts.count) := '2';
    tv_inserts.extend();
    tv_inserts(tv_inserts.count) := '3';

    for ind in tv_inserts.first..tv_inserts.last
    loop
        execute immediate 'insert into test_table(col1) values(:a)'
            using tv_inserts(ind);
    end loop;
end;

forall statement可以与执行立即数一起使用,fixing the table name in the string可以与下面的示例一样使用

{{1}}

请注意,如果没有先前处理输入数组,这种方法是不可行的。