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
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
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)
也不能写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.