日期:2014-05-17  浏览次数:20941 次

触发器
想学习一下触发器。请指教
有一张表A,三个字段ID,NAME(中文名),XMPY(名字首字母)
有一个函数F_TRANS_PINYIN_CAPITAL
如果增加一条记录1,张三
那个XMPY自动更新为‘zs’

请问这个触发器怎么写?
------解决方案--------------------
create or replace trigger a_trigger
before insert on a
for each row
begin
:new.XMPY := F_TRANS_PINYIN_CAPITAL(:new.NAME);
end;

------解决方案--------------------
你的ID字段是不是用的序列?
------解决方案--------------------

create or replace trigger a_trigger
before insert on a for each row
declare
pragma autonomous_transaction; --自由实务处理,调用函数或存储过程触发器有问题的话最好加这句
i_xmpy char(6);  --长度根据实际情况定,建议别用varchar2
begin
    i_xmpy := F_TRANS_PINYIN_CAPITAL(:new.NAME);
    update a set XMPY = i_xmpy 
    where ID = :new.ID;  --ID字段用的是序列的话,“:new.ID”可换成“序列名.currval”
end;

这段代码我直接写的,没有编译过,你先试试,没问题的话可以进行简化
------解决方案--------------------
楼主啊 你有没有试过1楼的代码 个人认为 仅通过你的描述 我认为1楼完全可以满足你的需求

如果你认为有问题 就说明你描述的不清晰

执行insert语句的时候 把名字取出来 通过你给的函数转换成拼音 赋值给new.XMPY 这就足够了 还写什么update啊 多此一举

另外 建议楼主以后描述问题的时候尽量详细 把你的想法和存在的问题都摆出来 这样大家才会帮你解决
看不懂的帖子 我很少回复 也懒得问
------解决方案--------------------
能不能弱弱的问一句,是不是也可以用after insert,毕竟要插入后才更新的么,万一插入时出问题了,没有插入进去,反而更新了字段。
------解决方案--------------------
针对同一张表示无法使用触发器的。建议还是在程序里插入数据时直接插入拼音码。
------解决方案--------------------
引用:
SQL code
create or replace trigger a_trigger
before insert on a
for each row
begin
    :new.XMPY := F_TRANS_PINYIN_CAPITAL(:new.NAME);
end;


这个可以