CREATE OR REPLACE TRIGGER ECCDBA.ColumnAdd_Auto   before insert ON ECCDBA.T_BASE_CLICOLUMN  --新增的时候出发
   for each row
declare 
begin 
    alter table :new.BELONGTABLE add :new.TCOLUMNNAME :new.TTYPE; --对:new.BELONGTABLE(表),新增:new.TCOLUMNNAME (字段),:new.TTYPE(类型)
end ColumnAdd_Auto;
/
编译的时候报错了: Found 'alter', CASE is expected

解决方案 »

  1.   


    CREATE OR REPLACE TRIGGER ECCDBA.ColumnAdd_Auto
    before insert ON ECCDBA.T_BASE_CLICOLUMN  --新增的时候出发
    for each row
    declare 
    PRAGMA AUTONOMOUS_TRANSACTION;--使用自治事务
    begin 
    execute immediate 'alter table '||:new.BELONGTABLE||' add '||:new.TCOLUMNNAME||' '|| :new.TTYPE;
    --对:new.BELONGTABLE(表),新增:new.TCOLUMNNAME (字段),:new.TTYPE(类型)
    commit;
    end ColumnAdd_Auto;
    /
    --例如:
    create or replace trigger alter_tri
    before insert on b
    for each row
    declare
    PRAGMA AUTONOMOUS_TRANSACTION;
    begin
    execute immediate 'alter table a add '||:new.tname||' '||:new.ttype;
    commit;
    end;scott@YPCOST> /触发器已创建scott@YPCOST> insert into b values('columnname','varchar2(40)');已创建 1 行。scott@YPCOST> commit;提交完成。scott@YPCOST> desc a;
     名称                                                                                      是否为空? 类型
     ----------------------------------------------------------------------------------------- -------- 
     ID                                                                                                 NUMBER
     TNAME                                                                                              VARCHAR2(20)
     COLUMNNAME                                                                                         VARCHAR2(40)
      

  2.   

    触发器无需commit
    也不能写commit
    触发器和触发它的DML是同一个事务
    DML提交了,触发器的操作也提交了,要不就一起回滚了当然,如果你一定要在触发器里写COMMIT
    那就用自治事务
    相当于一个事务里的子事务
    正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。
    解决办法有两种:
    1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
    如:
    CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_RCatalogue
    for each row
    DECLARE
    pragma autonomous_transaction;
    NRDSId varchar(500):='';
    begin
    2.可以另外写一个方法,把dll语句传递到这个方法中去执行。
    注释:
       ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
       DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。如insert,delete,update,select等都是DML.