一个建立触发器的问题有一个表,叫做TableList,这个表只有一列,列名叫做TableName,VARCHAR2(20)类型,
这一列保存的是一些表的名字,比如
TableName
---------
tbl_Table1
tbl_Table2
....
tbl_TabHaha我的目的是,当TableList这个表的某行被删除的时候,由这一行的TableName所命名的表也自动被删除。比如:当我们删除第二行的时候,表空间中的tbl_Table2这个表同时也被Drop了,请问各位有什么办法么?我本来是这么写的
CREATE OR REPLACE TRIGGER "MYTABLESPACE"."TRIG_TBLPHYMAP_ONDEL" AFTER DELETE
ON "USER_TABLE_PHYS_MAP"
FOR EACH ROW
DECLARE tblname VARCHAR(20);
BEGIN
   tblname := :old.PHY_TABLE_NAME;
   DROP TABLE tblname;
END;但是,我连编译都过不去,希望大虾们指点阿,先谢谢了。

解决方案 »

  1.   

    SQL> select * from dinya_main;TABLE_NAME
    ------------------------------
    DINYA_TEST01
    DINYA_TEST02SQL> select * from dinya_test01;        ID NAME
    ---------- -----------------------------------------------
             1 OKSQL> 
    SQL> create or replace trigger trg_test
      2      after delete on dinya_main
      3      for each row
      4  declare
      5      pragma autonomous_transaction;
      6      v_sql varchar2(500);
      7      v_table_name varchar2(30);
      8  begin
      9      v_table_name:=:old.table_name;
     10      v_sql:='drop table '||v_table_name;
     11      execute immediate v_sql;
     12  exception
     13      when others then
     14          null;
     15  end ;
     16  /Trigger createdSQL> delete from dinya_main t where t.table_name ='DINYA_TEST01';1 row deletedSQL> commit;Commit completeSQL> select * from dinya_test01;select * from dinya_test01ORA-00942: 表或视图不存在SQL> 
    SQL> 
    OK
      

  2.   

    写得真详细啊,对,把执行的drop语句写进一个临时变量v_sql里,然后在触发器里用 execute immediate v_sql;就可以了,其实这问题很多人都提过,楼主可以查一下历史的帖子的,:)