微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从PL / SQL过程块中删除

如何解决从PL / SQL过程块中删除

我目前正在尝试删除通过外键链接到另一张表的所有表行。

我的代码有点像这样:

CREATE OR REPLACE Procedure test
BEGIN
   DELETE FROM person;
End;
/

错误说:ora-02292完整性约束违反-找到子记录

当我尝试使约束无效时,它说我无法“改变”桌子。

我必须做什么/更改?

解决方法

您不应该只是 disable 约束,因为您将留下子记录 orphans (没有父记录)。那你会怎么做?

正确的处理方式是

  • 先删除孩子
  • 最后删除父母

如果使用on delete cascade选项创建了外键约束,则数据库将为您处理。


P.S。从“您不能更改表”开始,这不是Oracle错误消息。他们有自己的代码,例如ORA-06550。很难猜测您实际上做了什么,并且-如果我不得不猜测-我会说您尝试在该过程中做到这一点:

SQL> create table temp (id number constraint pkt primary key);

Table created.

SQL> begin
  2    alter table temp disable constraint pkt;
  3  end;
  4  /
  alter table temp disable constraint pkt;
  *
ERROR at line 2:
ORA-06550: line 2,column 3:
PLS-00103: Encountered the symbol "ALTER" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge

您将需要动态SQL来做到这一点:

SQL> begin
  2    execute immediate 'alter table temp disable constraint pkt';
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>

但是,这又不是您应该处理这种情况的方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。