请帮我解决下面我面临的问题,我必须在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;
答案 0 :(得分:1)
Oracle 10g -
在11g之前的Oracle版本中,您不能将FORALL
与EXECUTE IMMEDIATE
一起使用,仅与INSERT
,UPDATE
或DELETE
一起使用。< / p>
请参阅http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems021.htm
这是一种特殊的语法
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。