使用批量更新运行时插入,出现内部错误?
我正在尝试创建一个名为动态的运行时表,并使用批量更新从索引按表将数据插入其中,但是当我尝试执行它时,出现了此错误:
第 1 行出现错误: ORA-06550: 第 0 行,第 0 列: PLS-00801:内部错误[74301
]
declare
type index_tbl_type IS table of
number
index by binary_integer;
num_tbl index_tbl_type;
TYPE ref_cur IS REF CURSOR;
cur_emp ref_cur;
begin
execute immediate 'create table dynamic (v_num number)';--Creating a run time tabl
FOR i in 1..10000 LOOP
execute immediate 'insert into dynamic values('||i||')';--run time insert
END LOOP;
OPEN cur_emp FOR 'select * from dynamic';--opening ref cursor
FETCH cur_emp bulk collect into num_tbl;--bulk inserting in index by table
close cur_emp;
FORALL i in num_tbl.FIRST..num_tbl.LAST --Bulk update
execute immediate 'insert into dynamic values('||num_tbl(i)||')';
end;
I am trying to make a run time table named dynamic and inserting data into it from index by table using bulk update,but when i am trying to execute it this error is coming:
ERROR at line 1:
ORA-06550: line 0, column 0:
PLS-00801: internal error [74301
]
declare
type index_tbl_type IS table of
number
index by binary_integer;
num_tbl index_tbl_type;
TYPE ref_cur IS REF CURSOR;
cur_emp ref_cur;
begin
execute immediate 'create table dynamic (v_num number)';--Creating a run time tabl
FOR i in 1..10000 LOOP
execute immediate 'insert into dynamic values('||i||')';--run time insert
END LOOP;
OPEN cur_emp FOR 'select * from dynamic';--opening ref cursor
FETCH cur_emp bulk collect into num_tbl;--bulk inserting in index by table
close cur_emp;
FORALL i in num_tbl.FIRST..num_tbl.LAST --Bulk update
execute immediate 'insert into dynamic values('||num_tbl(i)||')';
end;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
FORALL 语句需要 SQL 语句 - INSERT、UPDATE 或 DELETE。 EXECUTE IMMEDIATE 是一个 PL/SQL 语句,这就是您的代码抛出该异常的原因。
在生产中采取这种特技并不是一个好主意。应使用 DDL 脚本而不是动态 SQL 来构建表。
Anyhoo,如果您想在这种动态样式中执行某些操作,请执行以下操作:
步骤 1:创建一个 SQL 类型,可以在 SQL 语句中使用
步骤 2:我的过程版本,它使用 SQL表类型而不是 PL/SQL 类型。我已将 FORALL 子句重写为动态 INSERT 语句,该语句在 TABLE() 子句中使用集合。
第 3 步:有效
The FORALL statement is expecting a SQL statement - INSERT, UPDATE or DELETE. EXECUTE IMMEDIATE is a PL/SQL statement, which is why your code is hurling that exception.
Pulling this kind of stunt is not a good idea in Production. Tables should be built using DDL scripts not dynamic SQL.
Anyhoo, if you want to do something in this sort of dynamic stylee this is how to go about it:
Step 1: create a SQL type, which can be used in SQL statements
Step 2: my version of your procedure, which uses the SQL table type instead of the PL/SQL one. I have rewritten the FORALL clause as a dynamic INSERT statement which uses the collection in a TABLE() clause.
Step 3: it works
那为什么这有效呢?
WHY this is working then?