Oracle存储过程使用游标的技巧代码
在Oracle中,他以一个语句块为一个默认的事务。也就是说,如果你就单单只执行一段ORACLE的语句块,他默认是以事务的形式执行的。
CREATE OR REPLACE PROCEDURE sp_EditInlayOut(
FID NUMBER, --修改记录的ID T_INLAYOUT表的主键
InlayBoxIDs varchar2, --修改的记录
BoxCount number, --装箱数量
ApplyUserID varchar2, --申请人编号
StoreUserID varchar2, --库管编号
ConfirmState char, --确认状态
ExistState char, --存在状态
strErr OUT varchar2 --存储过程执行结果。成功返回空,失败返回错误原因
)
AS
--定义变量
v_Now DATE;
v_Now2 date;
v_LogID number;
v_ChipID number;
v_sql varchar2(2000);
BEGIN
--记录日志
INSERT INTO T_InlayOut_Log(F_InlayBoxIDs,f_Boxcount,f_Applyuserid,f_Storeuserid,f_Addtime,f_Confirmstate
,f_Existstate, f_modifyid, f_modifytime, f_modifyuserid )
((SELECT F_InlayBoxIDs,f_Boxcount,f_Applyuserid,f_Storeuserid,f_Addtime,f_Confirmstate,f_Existstate
,FID,SYSDATE,StoreUserID FROM T_InlayOut WHERE F_ID=FID));
--取刚插入记录的ID
select seq_t_inlayout_log.currval into v_LogID from dual;
--定义游标
DECLARE CURSOR myCusor IS SELECT F_ID FROM T_CHIP WHERE F_InlayBoxID IN (SELECT f_ID FROM
T_InlayBox where F_InlayOutID = FID);
--开始使用游标取数据
BEGIN
OPEN myCusor;
LOOP
FETCH myCusor INTO v_ChipID;
--游标取不到数据则退出
EXIT WHEN myCusor%NOTFOUND;
SELECT MIN(F_CurrentTime)INTO v_Now FROM t_Chipstatehistory WHERE
(F_HistoryState = 'Confirm_InlayIn')AND F_ChipID = v_ChipID;
--改变芯片表的状态
UPDATEt_chip SET f_State = 'Confirm_InlayIn',F_CompareTime = v_Now WHERE F_ID = v_ChipID;
--保存芯片状态历史记录
INSERT INTO T_CHIPSTATEHISTORY(f_chipid, f_Historystate,F_TABLEID,f_Currenttime,F_TABLENAME)
VALUES
(v_ChipID,'Confirm_InlayIn',v_LogID,SYSDATE,'T_InlayOut_Log');
END LOOP;
相关新闻>>
- 发表评论
-
- 最新评论 更多>>