2

请帮助我解决我面临的以下问题,我必须在 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;
4

1 回答 1

2

甲骨文 10g -

在 11g 之前的 Oracle 版本中,不能使用FORALLwith EXECUTE IMMEDIATE,只能使用 with INSERTUPDATEDELETE.

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

这是一种特殊的语法

  1. 读起来像 FOR 循环但不是,并且
  2. PL/SQL 使用它来执行批量 DML 操作,并且只能使用确切的关键字,而不是使用动态 SQL 或任何其他代码。

甲骨文 11g +

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

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

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

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

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

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

于 2013-10-14T08:09:57.247 回答