Oracle 触发器怎么写?

例如现在有一个A表,一个B表,A表中有2个字段,一个ID,一个fieldname,在A表执行insert操作之后,在B表中添加一个新字段,字段名就是刚刚添加的fieldn... 例如现在有一个A表,一个B表 ,A表中有2个字段,一个ID,一个fieldname,
在A表执行insert 操作之后,在B表中添加一个新字段,字段名就是刚刚添加的fieldname
高悬赏求助.
展开
 我来答
badkano
2013-04-08 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144777 获赞数:885359
团长

向TA提问 私信TA
展开全部
这个只能遗憾的告诉你,不能实现
因为触发器中不能运行 ddl语句和commit,rollback语句
所谓的ddl语句就是用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等,DDL操作是隐性提交的!

其实刚才写了一个,创建的时候没问题,但是往a里插入数据时报错
create or replace trigger t_add_col
after insert on a
for each row
begin
execute immediate 'alter table b add '||:new.fieldname||' varchar2(30)';
end;

错误就是ora-04092,你可以看一下
tj_angela
推荐于2017-11-25 · TA获得超过7529个赞
知道大有可为答主
回答量:6797
采纳率:75%
帮助的人:2530万
展开全部
create or replace trigger t_insert
after insert
on A
for each row
declare
new_field varchar2(30);
begin
select fieldname into new_field
from (select id,fieldname,rownum rn from A order by 3 desc)
where rownum<=1;
execute immediate 'alter table B add ' || new_field || ' varchar2(30)';
end;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sxdtgsh
2013-04-08 · TA获得超过2221个赞
知道小有建树答主
回答量:913
采纳率:75%
帮助的人:797万
展开全部
-- 可以使用触发器+DBMS_JOB实现,以下是测试语句
-- 虽然可以实现,但是不推荐使用这样的方法实现数据库列的添加方法
-- 测试环境 Oracle9i
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as scott

sxdtgsh> drop table a;

Table dropped

sxdtgsh> create table a(id integer, fieldname varchar2(30));

Table created

sxdtgsh>
sxdtgsh> create or replace trigger t_add_col
2 after insert on a
3 for each row
4 declare
5 v_sql varchar2(500);
6 myjob integer;
7 begin
8 v_sql:= 'begin execute immediate ' || chr(39) || 'alter table b add '||:new.fieldname||' varchar2(30)' || Chr(39) || '; end;';
9 dbms_output.put_line(v_sql);
10 dbms_job.submit(myjob, v_sql, sysdate, null, false);
11 end;
12 /

Trigger created

sxdtgsh> drop table b;

Table dropped

sxdtgsh> create table b(ID integer);

Table created

sxdtgsh> desc b;
Name Type Nullable Default Comments
---- ------- -------- ------- --------
ID INTEGER Y

sxdtgsh> insert into A(id, fieldname) values (1, 'COL1');

begin execute immediate 'alter table b add COL1 varchar2(30)'; end;

1 row inserted

sxdtgsh> desc b
Name Type Nullable Default Comments
---- ------- -------- ------- --------
ID INTEGER Y

sxdtgsh> commit;

Commit complete

sxdtgsh> desc b;
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID INTEGER Y
COL1 VARCHAR2(30) Y

sxdtgsh> insert into A(id, fieldname) values (2, 'COL2');

begin execute immediate 'alter table b add COL2 varchar2(30)'; end;

1 row inserted

sxdtgsh> desc b
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID INTEGER Y
COL1 VARCHAR2(30) Y

sxdtgsh> rollback;

Rollback complete

sxdtgsh> desc b
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID INTEGER Y
COL1 VARCHAR2(30) Y

sxdtgsh> insert into A(id, fieldname) values (2, 'COL2');

begin execute immediate 'alter table b add COL2 varchar2(30)'; end;

1 row inserted

sxdtgsh> commit;

Commit complete
--因为是Job是异步的,所以需要等待job执行完成才可以看到结果。
sxdtgsh> desc b
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID INTEGER Y
COL1 VARCHAR2(30) Y

sxdtgsh> desc b
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID INTEGER Y
COL1 VARCHAR2(30) Y
COL2 VARCHAR2(30) Y
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式