使用批量更新运行时插入,给出内部错误?

Posted

技术标签:

【中文标题】使用批量更新运行时插入,给出内部错误?【英文标题】:Run time insert using bulk update ,giving an internal error? 【发布时间】:2010-05-06 15:33:02 【问题描述】:

我正在尝试创建一个名为动态的运行时间表,并使用批量更新将数据从表中的索引插入其中,但是当我尝试执行它时,会出现此错误:

第 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;

【问题讨论】:

正如我在其他问题中问过你的:为什么这个社区维基?这不是意见问题 【参考方案1】:

FORALL 语句需要一条 SQL 语句 - INSERT、UPDATE 或 DELETE。 EXECUTE IMMEDIATE 是一个 PL/SQL 语句,这就是您的代码抛出该异常的原因。

制作这种特技并不是一个好主意。应该使用 DDL 脚本而不是动态 SQL 来构建表。

Anyhoo,如果你想在这种动态风格中做某事,这就是如何去做:

第一步:创建一个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>

【讨论】:

【参考方案2】:
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; 

为什么这会起作用?

【讨论】:

以上是关于使用批量更新运行时插入,给出内部错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用重复键更新在 MariaDB 中批量插入

SQLAlchemy - 在 postgresql 中执行批量 upsert(如果存在,更新,否则插入)

为啥 Spring 在配置时并不总是使用批量插入/更新?

使用 Hibernate 批量插入或更新?

JdbcMessageHandler 批量更新 - 不要在一个错误上取消所有内容

批量插入数据和更新数据参考