关于游标和存储过程,值得一看!
如果在一个存储过程中用到游标,把游标检索到的记录集插入某一张表中,
这时候如果用到事务的话,感觉麻烦来了,实在循环体内判断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