单独在pl/sql运行语句就可以:
  DECLARE
  BEGIN
  EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
  EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
  END;
但是写在触发器里,当触发时就报错:
ora-04092:cannot commit in a trigger触发器:
CREATE OR REPLACE TRIGGER tri_del_type
BEFORE DELETE
ON bale_type_info
FOR EACH ROW  
DECLARE
  BEGIN
   EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
    DELETE FROM bale_info t WHERE t.type_id=:old.type_id;
  EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
END;

解决方案 »

  1.   

    一般情况下,触发器中是无法处理DDL语句的。但是可以使用自治事务来实现
    可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
    试试下面的语句。CREATE OR REPLACE TRIGGER tri_del_type
    BEFORE DELETE
    ON bale_type_info
    FOR EACH ROW  
    DECLARE
      pragma autonomous_transaction;
    BEGIN
       EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
        DELETE FROM bale_info t WHERE t.type_id=:old.type_id;
      EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
    END;
      

  2.   


    加入这个语句,报错
    ora-04031
      

  3.   

    ora-04031 问题解决了,把触发器删除,重新建之后运行,就没报这个错
      

  4.   

    yinan9 你的方案是对的,确实用自治事务之后,就能使用DDL语句了