Plsql Forall语句中execute immediate的编译问题

Plsql Forall语句中execute immediate的编译问题,plsql,oracle11g,bulkinsert,dynamic-sql,Plsql,Oracle11g,Bulkinsert,Dynamic Sql,请帮助我解决我面临的以下问题,我必须在FORALL内将数据插入表中(表名使用变量值生成,表已创建) Declare TYPE dept_data_rec IS RECORD ( Dept_no number, Dept_name varchar2(100), Dept_loc Varchar2(20) ); TYPE nt_dept_data IS TABLE OF dept_data_rec ; l_dept_data_nt nt_dept_data; BEGIN FO

请帮助我解决我面临的以下问题,我必须在FORALL内将数据插入表中(表名使用变量值生成,表已创建)

Declare
TYPE dept_data_rec IS RECORD
(
  Dept_no number,
  Dept_name varchar2(100),
  Dept_loc  Varchar2(20)
 );

TYPE nt_dept_data IS TABLE OF dept_data_rec ;

l_dept_data_nt nt_dept_data;

BEGIN

FORALL j IN 1..l_dept_data_nt.COUNT SAVE EXCEPTIONS
EXECUTE IMMEDIATE 'INSERT INTO '||l_get_dept_rec.dept_seq_no||'_Dept_Data  VALUES '||
l_dept_data_nt(j);
COMMIT;
编译此代码时,我遇到以下错误: PLS-00306:调用“| |”时参数的数量或类型错误

但是,当代码使用实际的表名时,它可以工作

FORALL j IN 1..l_dept_data_nt.COUNT SAVE EXCEPTIONS
INSERT INTO A1_dept_data VALUES
l_dept_data_nt(j);
COMMIT;

Oracle 10g-

在11g之前的Oracle版本中,您不能将
FORALL
executeimmediate
一起使用,只能与
INSERT
UPDATE
DELETE一起使用

这是一种特殊的语法

  • 这看起来像一个FOR循环,但不是,而且
  • PL/SQL使用它来执行大量DML操作,并且只使用确切的关键字,而不使用动态SQL或任何其他代码
  • Oracle 11g+

    在11g中,取消了对使用
    executeimmediate
    的限制。看

    但是,字符串中唯一允许的变量是
    USING
    子句中单个数组中的下标元素


    文档不清楚是否可以使用
    FORALL
    语法动态“更改”每行的表。请记住,PL/SQL使用
    FORALL
    来执行批量DML操作,这需要转到一个表才能获得任何性能优势

    针对上述问题的最佳性能解决方案

    您应该创建两级数组,第一级定义哪个表,第二级定义该表的数据


    在表数组上使用普通的
    FOR
    循环,在该循环中使用特殊的
    FOR all
    语法为一个表执行所有DML。

    正确<代码>部门数据(j)
    是行类型或记录类型;您只能连接字符串或可以转换为字符串的内容。我不认为可以使用bind变量来实现这一点,即使它被定义为
    %rowtype
    ,但我不能100%确定。您可能需要查看
    dbms\u sql
    。也许有人会有更好的主意(8-)谢谢。我觉得问题出在l_dept_data_nt(j)上,我也在尝试下面的方法,但同样的错误消息会出现。立即执行“插入A1|U部门数据值”| l|U部门数据(j);请提供部门数据的声明。似乎是一个收藏。问题是这个标量或复合数据类型集合的元素是什么?您好,声明添加在代码部分。文档不清楚您是否可以使用FORALL“更改”每行的表。我认为不会,因为这将导致0性能优势(纯粹的语法优势)。文档不清楚是否实际实施了单表限制,或者这只是导致性能降低!