*******100分*******trigger使用for update的困惑?

imdt 2002-04-12 08:26:03
create or repalce trigger Insert_sr
before insert on service_record
declare
old_id varchar2(14);
num_id number(14);
new_id varchar2(14);
BEGIN
--
---第一部分,选出最大id值

select max(srid) into old_id
from SRID_TB
where to_char(SRID_DAT,'yyyymmdd')=to_char(SYSDATE,'yyyymmdd');
--第二部分,产生新的id
if (old_id is not null) or (old_id='') then
--old_id 加一
num_id:=to_number(old_id);
num_id:=num_id +1;
new_id:=to_char(num_id);
UPDATE SRID_TB
SET SRID=new_id
WHERE SRID=old_id;
else
--NEW_id
new_id:=to_char(SYSDATE,'yyyymmdd');
new_id:=new_id || '000001';
INSERT INTO SRID_TB VALUES(new_id,SYSDATE);
end if;
:NEW.SR_ID:=new_id;

-----第三部分、试图进行异常处理

/*WHEN NO_DATA_FOUND THEN
--NEW_id
new_id:=to_char(SYSDATE,'yyyymmdd');
new_id:=new_id || '000001';
INSERT INTO SRID_TB VALUES(new_id,SYSDATE);
:NEW.SR_ID:=new_id;

*/
END;
...全文
115 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykliu1 2002-04-12
  • 打赏
  • 举报
回复
select srid into old_id
from SRID_TB
where to_char(SRID_DAT,'yyyymmdd')=to_char(SYSDATE,'yyyymmdd')
当查询返回超过一条记录时会产生例外TOO_MANY_ROWS;
当查询没有返回记录时会产生例外NO_DATA_FOUND;
因此建议使用MAX或COUNT函数
或者在EXCEPTION段中分别针对以上例外编写代码。
imdt 2002-04-12
  • 打赏
  • 举报
回复
to all:

我很想知道问题2的答案:

为什么加了for update,第二天,就不能生成新的id,
而去掉for update在新的一天就可以生成新的id

imdt 2002-04-12
  • 打赏
  • 举报
回复
to hrb_qiuyb(大森林) ,snowy_howe(天下有雪) :
为什么加入时
WHEN NO_DATA_FOUND THEN
……
会出错呢?

难道trigger只能处理特定的异常……
imdt 2002-04-12
  • 打赏
  • 举报
回复
to KingSunSha(弱水三千)

我希望我的id能代表一定的意义,而不是单纯的数字。
KingSunSha 2002-04-12
  • 打赏
  • 举报
回复
为什么要自己建立一个表放序列号?用sequence不可以吗?
chinaczg 2002-04-12
  • 打赏
  • 举报
回复
我就得你开始可以先判断count
select count(*) into nr
from SRID_TB
where to_char(SRID_DAT,'yyyymmdd')=to_char(SYSDATE,'yyyymmdd');0D if nr>0 then
select max(srid) into old_id from SRID_TB
where char(SRID_DAT,'yyyymmdd')=to_char(SYSDATE,'yyyymmdd');0D num_id:=to_number(old_id);
num_id:=num_id +1;
new_id:=to_char(num_id);
update ...
else
--NEW_id
new_id:=to_char(SYSDATE,'yyyymmdd');0D new_id:=new_id || '000001';
INSERT INTO SRID_TB VALUES(new_id,SYSDATE);
end if;

snowy_howe 2002-04-12
  • 打赏
  • 举报
回复
触发器类似于过程或函数,它们都是拥有声明、执行和异常的带名块。
ahui_201 2002-04-12
  • 打赏
  • 举报
回复
update 锁定问题
hrb_qiuyb 2002-04-12
  • 打赏
  • 举报
回复
1、你没必要用For update 选项的,for update 是要加行级锁的。
2、Trigger是可以加入异常处理的,如你加入如下的异常就不会报错
 when others then
NULL;

imdt 2002-04-12
  • 打赏
  • 举报
回复
各位,参与就给分(当然,您不要分俺决不勉强)……
imdt 2002-04-12
  • 打赏
  • 举报
回复
1、在create 语句中补充" for each row ",应该为
create or repalce trigger Insert_sr
before insert on service_record
for each row

2、 在该表srid_tb中我纪录的另外一个表中每天的最大id值,在新的一天我让trigger自动产生一个新的id值
目前的trigger可以正常的执行。

可是,第一部分我原来用的sql语句为:
select srid into old_id
from SRID_TB
where to_char(SRID_DAT,'yyyymmdd')=to_char(SYSDATE,'yyyymmdd')
for update;

这样到,新的一天时,总是不能声称新的id。

3、 请问各位,for update 对以后的语句造成什么影响?为什么在没有查找到相应值时,为什么以后的语句也不执行呢?

4、 trigger是不是不允许进行异常处理,为什么我加上异常处理,就会error?


imdt 2002-04-12
  • 打赏
  • 举报
回复
to ykliu1(river) :


可是,我目前的代碼,沒有使用異常處理,

在新的一天內照樣可以生成新的id??????????

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧