Plsql Forall语句中execute immediate的编译问题
请帮助我解决我面临的以下问题,我必须在FORALL内将数据插入表中(表名使用变量值生成,表已创建)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
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性能优势(纯粹的语法优势)。文档不清楚是否实际实施了单表限制,或者这只是导致性能降低!