关于游标和存储过程,值得一看!

shaxiren 2003-10-09 11:21:24
如果在一个存储过程中用到游标,把游标检索到的记录集插入某一张表中,
这时候如果用到事务的话,感觉麻烦来了,实在循环体内判断IF @@ERROR<>0还是其他?
看如下例子,程序本生很简单,这样是否合理。在循环体内判断是否回影响效率,大家一般怎么做?
CREATE PROCEDURE TKSP_TRADE_INTO_TODAY AS


DECLARE @CARD_SERIARY CHAR(16)
DECLARE @CARD_TRADE_NO INT
DECLARE @TRADE_TYPE CHAR(2)
DECLARE @TRADE_TIMES DATETIME
DECLARE @REAL_MONEY INT
DECLARE @TRAN_MONEY INT
DECLARE @CARD_MONEY INT
DECLARE @CITY_NO CHAR(4)
DECLARE @CALLING_NO CHAR(2)
DECLARE @UNIT_NO CHAR(4)
DECLARE @POS_NO CHAR(6)
DECLARE @TERMINAL_NO CHAR(12)
DECLARE @TERMINAL_TRAN_NO BIGINT
DECLARE @INS_TIME DATETIME
DECLARE @BEFORE_DEAL_TIME DATETIME
DECLARE @TAC_NO CHAR(8)
DECLARE @MAC_NO CHAR(8)

DECLARE @TRADE_DATE CHAR(8)
DECLARE @TRADE_TIME CHAR(6)
DECLARE @TRADE_YYYY CHAR(4)
DECLARE @TRADE_MM CHAR(2)
DECLARE @TRADE_DD CHAR(2)
DECLARE @TRADE_HH CHAR(2)
DECLARE @TRADE_MI CHAR(2)
DECLARE @TRADE_SS CHAR(2)
DECLARE @REC_TYPE TINYINT
DECLARE @ORDER_ID CHAR(6)

BEGIN TRAN
SELECT @BEFORE_DEAL_TIME=GETDATE()
DECLARE IO2TODA_CURSOR CURSOR FOR
SELECT DISTINCT REC_TYPE,CARD_SERIARY,CARD_TRADE_SERIARY,TRADE_TYPE,RTRIM(TRADE_DATE) , RTRIM(TRADE_TIME),
TRADE_MONEY,YISHOU_MONEY,BEFORE_TRADE_MONEY,CITY_NO,CALLING_NO,UNIT_NO,POS_NO,
PSAM_NO,TERMINAL_SERIARY,INS_TIME,@BEFORE_DEAL_TIME,TRADE_TAC,MAC_CODE,ORDER_ID
FROM TK_TRADE_IO A
WHERE TAC_STATE=01 AND REC_TYPE=0 AND CITY_NO='2150'
AND NOT EXISTS (SELECT CARD_SERIARY,CARD_TRADE_NO FROM TK_TODAY_TRADE B WHERE A.CARD_SERIARY=B.CARD_SERIARY AND A.CARD_TRADE_SERIARY=B.CARD_TRADE_NO)

OPEN IO2TODAY_CURSOR
IF @@ERROR<>0 THEN --此处我加了一个判断语句,有没有必要?
BEGIN
ROLLBACK
RETURN 1
END
FETCH IO2TODAY_CURSOR INTO
@REC_TYPE,
@CARD_SERIARY,
@CARD_TRADE_NO,
@TRADE_TYPE,
@TRADE_DATE,
@TRADE_TIME,
@REAL_MONEY,
@TRAN_MONEY,
@CARD_MONEY,
@CITY_NO,
@CALLING_NO,
@UNIT_NO,
@POS_NO,
@TERMINAL_NO,
@TERMINAL_TRAN_NO,
@INS_TIME,
@BEFORE_DEAL_TIME,
@TAC_NO,
@MAC_NO,
@ORDER_ID
IF @@ERROR<>0 THEN --此处我加了一个判断语句,有没有必要?
BEGIN
ROLLBACK
RETURN 1
END

WHILE @@SQLSTATUS = 0
BEGIN

SELECT @TRADE_YYYY=LEFT(@TRADE_DATE,4)

SELECT @TRADE_MM=SUBSTRING(@TRADE_DATE,5,2)
SELECT @TRADE_DD=RIGHT(@TRADE_DATE,2)

SELECT @TRADE_HH=LEFT(@TRADE_TIME,2)
SELECT @TRADE_MI=SUBSTRING(@TRADE_TIME,3,2)
SELECT @TRADE_SS=RIGHT(@TRADE_TIME,2)

SELECT @TRADE_TIMES=@TRADE_YYYY + '-' + @TRADE_MM + '-' + @TRADE_DD + ' ' + @TRADE_HH + ':' + @TRADE_MI + ':' + @TRADE_SS


INSERT INTO TK_TODAY_TRADE
(CARD_SERIARY,
CARD_TRADE_NO,
TRADE_TYPE,
TRADE_TIME,
REAL_MONEY,
TRAN_MONEY,
CARD_MONEY,
CITY_NO,
CALLING_NO,
UNIT_NO,
POS_NO,
TERMINAL_NO,
TERMINAL_TRAN_NO,
INS_TIME,
BEFORE_DEAL_TIME,
TAC_NO,
MAC_NO,
ORDER_ID)
VALUES(
@CARD_SERIARY,
@CARD_TRADE_NO,
@TRADE_TYPE,
@TRADE_TIMES,
@REAL_MONEY,
@TRAN_MONEY,
@CARD_MONEY,
@CITY_NO,
@CALLING_NO,
@UNIT_NO,
@POS_NO,
@TERMINAL_NO,
@TERMINAL_TRAN_NO,
@INS_TIME,
@BEFORE_DEAL_TIME,
@TAC_NO,
@MAC_NO,
@ORDER_ID
)
IF @@ERROR<>0 THEN --此处我加了一个判断语句,有没有必要?
BEGIN
ROLLBACK
RETURN 1
END

FETCH IO2TODA_CURSOR INTO
@REC_TYPE,
@CARD_SERIARY,
@CARD_TRADE_NO,
@TRADE_TYPE,
@TRADE_DATE,
@TRADE_TIME,
@REAL_MONEY,
@TRAN_MONEY,
@CARD_MONEY,
@CITY_NO,
@CALLING_NO,
@UNIT_NO,
@POS_NO,
@TERMINAL_NO,
@TERMINAL_TRAN_NO,
@INS_TIME,
@BEFORE_DEAL_TIME,
@TAC_NO ,
@MAC_NO,
@ORDER_ID
IF @@ERROR<>0 THEN --此处我加了一个判断语句,有没有必要?
BEGIN
ROLLBACK
RETURN 1
END
END
CLOSE TMP2IO_CURSOR
DEALLOCATE TMP2IO_CURSOR
COMMIT
RETURN 0
GO
...全文
25 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
beckhambobo 2003-10-09
  • 打赏
  • 举报
回复
IF @@ERROR<>0 THEN --此处我加了一个判断语句,有没有必要?
BEGIN
ROLLBACK
RETURN 1
END
把此句修改为
exception
when others then
rollback;
return;
end;

其它把相应的修改pl/sql语法
qiyousyc 2003-10-09
  • 打赏
  • 举报
回复
怎么看起来是sql server的存储过程,不是oracle的存储过程吧?

在oracle中,`判断错误用
EXCEPTION
WHEN OTHERS THEN
shaxiren 2003-10-09
  • 打赏
  • 举报
回复
help

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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