在触发器中不能对本表再进行操作,包括查询和DML操作,你用一个最简单的也是不行的!可能需要用其它的方法来解决了!
解决方案 »
- 问个奇葩的问题,关于程序异常退出,数据库锁定字段是否能还原?
- 有关not exists except的问题,初学者别见怪~~
- Oracle增量备份、累积差异性备份,备份的是变更的数据还是记录数据变更算日志?
- 请问在ORACLE中执行 SELECT TO_CHAR(DATE,'YYYYMMDD') FROM TABLE1为什么不对?
- 为何不能以SYSDBA的权限进入SQL*PLUS?
- 数据库操作为什么不能执行
- 小弟对数据库不是很懂,请教各位大侠两条sql有什么不同?谢谢!
- ORACEL中数据一对多的关系
- 求助大神 sql乘客出行统计
- oracle months_between()函数
- 求一sql语句,请各位大侠帮忙!
- 我有一个表示状态的字段用“1,2,3”表示,在返回的结果中把它变为“有,无,不确定”!
CREATE OR REPLACE TRIGGER USERNAME.TABLE_NAME AFTER
INSERT ON USERNAME.TABLE_NAME BEGIN
update TABLE_NAME set yy=replace(yy,'\','/' where rowid=(select max(rowid) from TABLE_NAME);
END;
这个触发器是在表TABLE_NAME里插入“89\78”后,把值改为“89/78”
读或修改触发语句的任何变异表,其中包括触发表本身。
读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。除此之外的其他列可以修改。注意,是行触发器对变异表操作存在这两个限制,你下面这个是语句级的
因此需要两个触发过程。
下面是实现的例子:
////////////////////////
包create or replace package pck_scoscottzcntestsen as
type tab_num is table of number
index by binary_integer;
type tab_class is table of varchar2(10)
index by binary_integer;
v_num tab_num;
v_class tab_class;
v_count number :=0;
end;//////////
行级create or replace trigger trg_scoscottzcntestsen1
before update on scott.zcn
for each row
begin
pck_scoscottzcntestsen.v_count := pck_scoscottzcntestsen.v_count + 1;
pck_scoscottzcntestsen.v_num(pck_scoscottzcntestsen.v_count) := :new.num;
pck_scoscottzcntestsen.v_class(pck_scoscottzcntestsen.v_count) := :new.class;
end ;
///////////////////////////////////////////////////////////////////
////语句级
create or replace trigger trg_scoscottzcntestsen2
after update of name on scott.zcn
declare
v_maxnum constant number :=5;
v_curnum number :=0;
v_num number;
v_class varchar2(10);
begin
for icount in 1.. pck_scoscottzcntestsen.v_count loop
v_class := pck_scoscottzcntestsen.v_class(icount);
select count(1) into v_curnum
from scott.zcn a
where a.class = v_class;
if v_curnum > v_maxnum then
raise_application_error(-20000,v_class || 'scott:sen当前人数已满!asdfasdf');
end if;
end loop;
pck_scoscottzcntestsen.v_count := 0;
end ;
DELARE
TEST_ROW TABLENAME%ROWTYPE;
BEGIN
SELECT * INTO TEST_ROW FROM TABLENAME WHERE ROWID=(SELECT MAX(ROWID) FROM TABLENAME)
END;
还是不可以用,说是读不到数据。请教能否推荐一书关于触发器的书,我找了好长时间都找不到一个讲触发器的讲了很细的书,看见飞鱼大侠有这样的功力,真是佩服不已呀。