第一个表TBInfo中有三个字段MasterId char(18),DTime char(16)
第二个表TBCount中有两个字段MasterId char(18),DTime char(16) , DCount char(1)
当像TBCount表中插入数据时触发比如 Insert Into TBCount (MasterId,DTime) Values ('13065019861126001x',‘2009120211260000’) <DTime是精确到毫秒的时间>
1.首先判断TBCount表中今天是否有这条数据:Select Count(*) From TBCount Where MasterId='13065019861126001x' And DTime>'今天的零时,像 <2009120200000000>'
1.如果有0条记录则将这条记录插入TBCount表中,并把DCount字段赋为1;
2.如果有记录并且记录数小于2则Update把DCount字段++1;
3.如果有记录并且记录数大于等于2,则抛出异常RAISE_APPLICATION_ERROR(-20055,'INVALID CODE')阻止其插入;
这个触发器实现的逻辑就是在一个MasterId在一天之内只能插入两条数据
我一直用MSSql的,对Oracle的语法不太懂,哪位大侠帮帮忙啊分不是问题
第二个表TBCount中有两个字段MasterId char(18),DTime char(16) , DCount char(1)
当像TBCount表中插入数据时触发比如 Insert Into TBCount (MasterId,DTime) Values ('13065019861126001x',‘2009120211260000’) <DTime是精确到毫秒的时间>
1.首先判断TBCount表中今天是否有这条数据:Select Count(*) From TBCount Where MasterId='13065019861126001x' And DTime>'今天的零时,像 <2009120200000000>'
1.如果有0条记录则将这条记录插入TBCount表中,并把DCount字段赋为1;
2.如果有记录并且记录数小于2则Update把DCount字段++1;
3.如果有记录并且记录数大于等于2,则抛出异常RAISE_APPLICATION_ERROR(-20055,'INVALID CODE')阻止其插入;
这个触发器实现的逻辑就是在一个MasterId在一天之内只能插入两条数据
我一直用MSSql的,对Oracle的语法不太懂,哪位大侠帮帮忙啊分不是问题
解决方案 »
- oracle sql问题
- Oracle数据库 在使用Blob字段类型的时候怎样实现模糊查询
- 推荐一个比toad,plsql developer还好用的工具
- 求oracle shell编程资料
- oracle8i p4安装问题
- 使用UTL_SMTP发送邮件收不到的问题
- TNS-12154 TNS:could not resolve service name
- 在oracle9i中如何看到数据库中的全部表
- oracle 里的sql plus有何什么用?
- exp imp 的问题!!!!
- windows Server2008下64位oracle11g中加载oci.dll失败
- 谁有oracle10g 的序列号 产品号 密码?
怎么没了
bug?
CREATE OR REPLACE TRIGGER tri_tbcount
BEFORE INSERT ON tbcount
FOR EACH ROW
DECLARE
n_count NUMBER;
BEGIN
SELECT COUNT(1)
INTO n_count
FROM tbcount
WHERE masterID = :NEW.masterid
AND Dtime > to_char(trunc(SYSDATE, 'DD'), 'yyyy-mm-dd hh24:mi:ss'); IF n_count = 0 THEN
:NEW.Dcount := 1;
ELSIF n_count = 1 THEN
:NEW.Dcount := 2;
ELSE
RAISE_APPLICATION_ERROR(-20055, 'INVALIDCODE');
END IF;END tri_tbcount;
这样应该可以解决你问题。
不过如果表的业务量大建议不要用触发器,容易锁表。
create or replace trigger TBCount_insert
before insert on TBCount for each row
declare
pragma autonomous_transaction;
cnt int := 0;
begin
select count(1) into cnt
from TBCount
where MasterId = :new.MasterId
and DTime > to_char(sysdate,'yyyymmdd')||'00000000';
if cnt = 0 then
:new.DCount := 1;
elsif cnt < 2 then
update TBCount set DCount = DCount + 1 where MasterId = :new.MasterId;
elsif cnt >=2 then
RAISE_APPLICATION_ERROR(-20055,'INVALIDCODE');
end if;
commit;
end;
/