在Forall语句中执行立即编译问题

时间:2013-10-14 07:14:22

标签: 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

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;

1 个答案:

答案 0 :(得分:1)

Oracle 10g -

在11g之前的Oracle版本中,您不能将FORALLEXECUTE IMMEDIATE一起使用,仅与INSERTUPDATEDELETE一起使用。< / p>

请参阅http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems021.htm

这是一种特殊的语法

  1. 读取类似FOR循环,但不是,
  2. PL / SQL使用
  3. 执行批量DML操作,并且只使用确切的关键字,而不是动态SQL或任何其他代码。
  4. Oracle 11g +

    在11g中,取消了使用EXECUTE IMMEDIATE的限制。见http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/forall_statement.htm

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

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

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

    你应该制作两个级别的数组,第一个定义哪个表,第二个定义该表的数据。

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