DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 20
在线用户: 12
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 chenliang_820 (亮仔) ★☆☆☆☆ -
盒子活跃会员
2017/7/11 16:02:07
标题:
触发器 ,保存时卡死;哪位在线的帮看看问题在哪 浏览:1424
加入我的收藏
楼主: CREATE TRIGGER T_INSERTITEM  ON dbo.STOCK_IN_LN    -------/进仓
FOR INSERT
AS
begin
 declare  @WAY_NO  VARCHAR(12),
          @ITEM_CODE NVARCHAR(20),
          @UNIT          NVARCHAR(6),
          @LOCATION       NVARCHAR(10),
          @QTY    float,
          @IS_IN  INT
 
declare YB02 CURSOR  /*声明游标*/
for
    select WAY_NO,ITEM_CODE,UNIT,LOCATION,IS_IN,QTY from   INSERTED 
    open YB02
    fetch next from YB02 into @WAY_NO,@ITEM_CODE,@UNIT, @LOCATION ,@IS_IN ,@QTY          /*读取第一条数据*/
    while(@@fetch_status=0) /*表示成功执行fetch语句*/
 
IF @QTY =NULL

SET @QTY=0

IF   @IS_IN=1     --- 进仓
  begin
    IF   (SELECT  count(*) from  STOCK_INFO   WHERE ( @ITEM_CODE=ITEM_CODE   AND @UNIT=UNIT AND   @LOCATION =LOCATION) )=0   
      insert into  STOCK_INFO  (  ITEM_CODE, UNIT, LOCATION,QTY_IN)  SELECT   @ITEM_CODE, @UNIT,@LOCATION,@QTY
      ELSE
      UPDATE  STOCK_INFO  SET QTY_IN=QTY_IN+@QTY  WHERE  @ITEM_CODE=ITEM_CODE   AND @UNIT=UNIT AND   @LOCATION =LOCATION

fetch next from YB02 into @WAY_NO,@ITEM_CODE,@UNIT, @LOCATION ,@IS_IN ,@QTY  

end

close YB02

deallocate YB02

  END
----------------------------------------------
不是高手,但要努力成为高手!
作者:
男 porter520 (Porter) ★☆☆☆☆ -
普通会员
2017/7/11 16:46:40
1楼: 不要用游标写,其他方法代替。游标太慢了。还有,看看能不能优化你的语句。

例如
while Exists() do 
begin


end
----------------------------------------------
123
作者:
男 chenliang_820 (亮仔) ★☆☆☆☆ -
盒子活跃会员
2017/7/11 17:00:19
2楼: 因为我要批量插入,不用就只更新一条数据
----------------------------------------------
不是高手,但要努力成为高手!
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2017/7/11 18:09:36
3楼: 这个触发器写的也是绝了。。。
----------------------------------------------
--
作者:
男 ghs_79 (ghs) ★☆☆☆☆ -
盒子活跃会员
2017/7/12 8:39:13
4楼: 不要用游标,直接更新或者插入。供参考。
--先更新
 UPDATE  STOCK_INFO  SET QTY_IN=a.QTY_IN+b.QTY 
from STOCK_INFO  a, inserted b
WHERE  a.ITEM_CODE=b.ITEM_CODE   AND a.UNIT=b.UNIT AND   a.LOCATION =b.LOCATION
--再插入
insert into  STOCK_INFO  (  ITEM_CODE, UNIT, LOCATION,QTY_IN) 
select a.ITEM_CODE,a.UNIT,a.LOCATION,a.QTY from   INSERTED a
left join STOCK_INFO b on a.ITEM_CODE=b.ITEM_CODE   AND a.UNIT=b.UNIT AND   a.LOCATION =b.LOCATION
where b.item_code is null
----------------------------------------------
Delphi爱好者。
作者:
男 lzhg_kn (lzhg_kn) ★☆☆☆☆ -
盒子活跃会员
2017/7/12 8:51:52
5楼: 看看 fetch next 在循环中的位置,不死就怪了
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/7/12 9:29:29
6楼: 对于多条记录的 插入,如果没有规律,不用游标 怎么可能逐条处理。
当然,楼主这种是规律比较强的,用 4楼的办法是不错的。

另外 while 之后,不需要写 BEGIN 吗?
楼主的 缩进太牛了,看不懂。

这种情况,不卡死,没天理。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 chenliang_820 (亮仔) ★☆☆☆☆ -
盒子活跃会员
2017/7/12 16:38:04
7楼:    后来我自己也发现问题了,感谢!
----------------------------------------------
不是高手,但要努力成为高手!
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/7/12 16:43:00
8楼: 虽然大家都能猜出问题在哪里。
但是 我们也就只能猜猜,无法确定。

楼主既然已经发现了,为啥不说?

等我挖苦你,你才肯说?

请问,如何挖苦你,到什么程度,你才肯说?
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS