【发布时间】:2013-10-14 07:14:21
【问题描述】:
请帮助我解决我面临的以下问题,我必须在 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;
【问题讨论】:
-
对。
l_dept_data_nt(j)是行类型或记录类型;你只能连接一个字符串,或者可以转换为字符串的东西。我不认为你可以使用绑定变量来做到这一点,即使它被定义为%rowtype,但我不是 100% 确定。您可能需要查看dbms_sql。不过有人可能有更好的主意 *8-) -
谢谢..我觉得问题出在 l_dept_data_nt(j) 上,我也在下面尝试,但是同样的错误消息来了。 EXECUTE IMMEDIATE 'INSERT INTO A1_dept_DATA VALUES '||l_dept_data_nt(j);
-
请提供
l_dept_data_nt的声明。似乎是一个集合。问题是该集合的元素是标量还是复合数据类型? -
嗨 Nic,代码部分中添加了声明
-
文档不清楚您是否可以使用 FORALL 来“更改”每行的表。我认为不会,因为这会带来 0 的性能优势(纯粹的语法优势)。
标签: plsql oracle11g bulkinsert dynamic-sql