【问题标题】:Example for insert and delete for dynamic cursor动态游标的插入和删除示例
【发布时间】:2012-05-25 08:57:41
【问题描述】:

Execute Immediate 用于FORALLBULK 在 pl/sql 块中收集:

FORALL i in rowid.FIRST ..rowid.LAST
Execute Immediate 'Delete table_name  where rowid '=rowid(i)

上面的东西是行不通的。谁能给出insertdelete 的语法?

【问题讨论】:

  • 您能否包括您正在使用的确切语法并详细说明您收到的错误?
  • 嘿 ryan,我想在批量删除中使用立即执行。我正在寻找它的 syantax。我们可以在不使用绑定变量的情况下使用 Execute Immediate
  • 这种方式不能使用立即执行。如果要在批量中删除,您可以执行以下操作:其中 table_name 是表的名称 TYPE delete_list IS TABLE OF table_name.id%TYPE; (将要从表中删除的值添加到 delete_list) FORALL i IN delete_list.first .. delete_list.last DELETE FROM forall_test WHERE id = delete_list(i);

标签: sql oracle plsql oracle10g oracle11g


【解决方案1】:

以下是如何实现此目的的示例:

create table brainoverflow as ( select * from all_objects );

select count(*) from brainoverflow;

declare
  type ri is table of rowid;
  rowids ri;
begin
  select rowid bulk collect into rowids from brainoverflow;
  for i in rowids.first .. rowids.last loop
    execute immediate ('delete brainoverflow where rowid='''||rowids(i)||'''');
  end loop;
end;
/

select count(*) from brainoverflow;

在 SQL*Plus 中执行:

oracle@stormwind:~$ sqlplus phil/phil

SQL*Plus: Release 11.2.0.3.0 Production on Fri May 25 11:37:40 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table brainoverflow as ( select * from all_objects );

Table created.

SQL> select count(*) from brainoverflow;

  COUNT(*)
----------
     72440

SQL> declare
  2    type ri is table of rowid;
  3    rowids ri;
  4  begin
  5    select rowid bulk collect into rowids from brainoverflow;
  6    for i in rowids.first .. rowids.last loop
  7      execute immediate ('delete brainoverflow where rowid='''||rowids(i)||'''');
  8    end loop;
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL> select count(*) from brainoverflow;

  COUNT(*)
----------
     0

SQL> 

【讨论】:

  • 执行立即删除会比批量删除慢吗?
  • 当然。您正在执行 N 语句而不是单个语句。我只是在回答这个问题:)
  • 以上导致 ORA:06550
  • 它对我有用。请记住,上面是一个测试用例(将其全部粘贴到 SQL*Plus 中查看)。您的代码所需的 PL/SQL 部分位于 declare .. end 之间;部分。确切的错误信息是什么?
  • ORA-06550 是一般错误,它告诉您错误在源代码中的位置。它没有说明导致错误的原因。再看一遍 - 那里不止一条消息......
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 2020-07-19
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多