我正在尝试创建一个名为dynamic的运行时表,并使用批量更新从表中逐个数据地插入数据,但是当我尝试执行它时,此错误即将发生:
第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;
答案 0 :(得分:2)
FORALL语句需要一个SQL语句 - INSERT,UPDATE或DELETE。 EXECUTE IMMEDIATE是一个PL / SQL语句,这就是你的代码抛出异常的原因。
在制作中拉这种特技并不是一个好主意。表应该使用DDL脚本而不是动态SQL构建。
Anyhoo,如果你想在这种动态的风格中做点什么,这就是如何去做:
步骤1:创建一个SQL类型,可以在SQL语句中使用
SQL> create or replace type my_nums as table of number
2 /
Type created.
SQL>
第2步:我的程序版本,它使用SQL表类型而不是PL / SQL类型。我已将FORALL子句重写为动态INSERT语句,该语句在TABLE()子句中使用该集合。
SQL> declare
2
3 num_tbl my_nums;
4 TYPE ref_cur IS REF CURSOR;
5 cur_emp ref_cur;
6 begin
7 execute immediate 'create table dynamic (v_num number)';
8
9 FOR i in 1..10000 LOOP
10 execute immediate 'insert into dynamic values('||i||')'
11 END LOOP;
12 OPEN cur_emp FOR 'select * from dynamic';
13 FETCH cur_emp bulk collect into num_tbl;
14 close cur_emp;
15
16 execute immediate
17 'insert into dynamic select * from table(:1)' using num_tbl;
18 end;
19 /
PL/SQL procedure successfully completed.
SQL>
第3步:它有效
SQL> select count(*) from dynamic
2 /
COUNT(*)
----------
20000
SQL>
答案 1 :(得分:-1)
DECLARE
TYPE numlist is table of number index by binary_integer;
var_num numlist;
BEGIN
for i in 1..1000 loop
var_num(i):=i;
end loop;
EXECUTE IMMEDIATE 'create table exe_table(col1 number(10))';
forall i in var_num.first..var_num.last
EXECUTE IMMEDIATE 'INSERT INTO exe_table values(:P)' USING var_num(i);
end loop;
为什么这样做呢?