作为关系型数据库市场的老大,Oracla占有举足轻重的地位。虽然在操作上不如SQLSERVER那样方便,但是他的强大的功能<br>还是吸引来大批大批的追随着。本人作为ORACLE菜鸟,在工作当中也偶尔使用Oracle。以下记录的上由于工作需要写的Oracle的<br>使用游标的储存过程,个人觉得比较有代表性。希望给初学者一定的帮助,也给自己加深一下印象。

在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));--取刚插入记录的IDselect 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);--开始使用游标取数据BEGINOPEN myCusor;LOOPFETCH 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;CLOSE myCusor;END;--选择最近芯片状态变更时间--SELECT MIN(F_CURRENTTIME) INTO v_NOW  FROM T_CHIPSTATEHISTORY WHERE F_HISTORYSTATE = 20 AND F_CHIPID IN (SELECT F_ID FROM T_CHIP WHERE F_InlayBoxID=(SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID));--将芯片表中芯片状态更新到以前状态--UPDATE T_CHIP SET F_State=20,F_CompareTime=v_NOW WHERE F_InlayBoxID IN (SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID =FID);--记录芯片状态变更日志--INSERT INTO  T_ChipStateHistory (F_ChipID,f_Historystate,f_Tableid,f_Currenttime,f_Tablename)VALUES--((SELECT F_ID FROM T_CHIP WHERE F_InlayBoxID=(SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID)),20,v_LogID,SYSDATE,'T_InlayOut_Log');--将Inlay出库箱表中以前的数据更新到以前状态UPDATE T_InlayBox SET F_State=2,F_InlayOutID=null WHERE F_InlayOutID =FID;--编辑时将新的INLAY出库信息更新UPDATE T_InlayOut SET F_InlayBoxIDs=InlayBoxIDs,f_Boxcount=BoxCount,f_Applyuserid=ApplyUserID,f_Storeuserid=StoreUserID,f_Confirmstate=ConfirmState,F_ExistState=ExistState,F_ConfirmTime=null WHERE F_ID=FID;--更新T_InlayBox 新的状态--UPDATE T_InlayBox SET F_State=3,F_InlayOutID=FID WHERE F_ID in (InlayBoxIDs);v_sql := 'UPDATE T_InlayBox SET F_State=3,F_InlayOutID='||FID||' WHERE F_ID in ('||InlayBoxIDs||')';--立即执行v_sqlEXECUTE IMMEDIATE  v_sql;SELECT SYSDATE INTO  v_Now2 FROM DUAL;--更新芯片表状态UPDATE T_Chip SET F_State='No_Confirm_InlayOut',F_CompareTime=v_Now2  WHERE F_InlayBoxID IN(SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID);--记录当前操作日志INSERT INTO  T_ChipStateHistory (F_ChipID,f_Historystate,f_Tableid,f_Currenttime,f_Tablename) SELECT F_ID,'No_Confirm_InlayOut',v_LogID,v_Now2,'T_InlayOut_Log' FROM T_CHIP WHERE F_InlayBoxID IN(SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID);--提交COMMIT;--发生异常时返回错误码EXCEPTIONWHEN OTHERS THENstrErr := substr(sqlerrm,1,100);ROLLBACK;
END sp_EditInlayOut;

但是在SQLSERVER中,除非你将所有的T-SQL语句块以显示的方式【BEGIN TRANSACTION ....END TRANSACTION】申明在事务中,否则SQLSERVER会将语句块中的每一句作为一个单独的默认事务执行。

此外,游标是一种比较占I/O资源的操作,使用完后应该及时关闭,以释放系统资源。

Oracle数据库游标在存储过程中的使用相关推荐

  1. 使用oracle 游标修改数据,修改oracle数据库游标

    SQL游标原理和使用方法 版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/chinahuyong/article/details/3552248 SQL ...

  2. oracle利用游标添加数据库,Oracle数据库游标的类型及使用实例全解

    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.Oracle数据库的Cursor类型包含三种: 静态游标:分为显式(explicit)游标 ...

  3. oracle 游标 904,如何解决Oracle数据库游标连接超出问题

    如何解决Oracle数据库游标连接超出问题 发布时间:2020-07-21 10:57:35 来源:亿速云 阅读:103 作者:小猪 这篇文章主要讲解了如何解决Oracle数据库游标连接超出问题,内容 ...

  4. oracle中毒,oracle数据库中毒恢复 oracle数据库解密恢复 服务器中勒索病毒解密恢复.Hermes666...

    oracle数据库中毒恢复 oracle数据库解密恢复 服务器中勒索病毒解密恢复.Hermes666 客户名称 保密 数据类型 oracle 11G 数据容量 100 gb 故障类型 服务器中毒,文件 ...

  5. 用ado把excel数据写入oracle,如何将excel表格数据导入到oracle数据库对应的表中?!oracle导出excel文件...

    如何把excel里的表导入到oracle里 使用第三方工具吧,toad之类的 一个excel表格中有多个sheet,如何将其导入oracle数据库 户和要用DBA 最简单得建用户: create us ...

  6. oracle数据库表excel文件位置,“如何将excel表格数据导入到oracle数据库对应的表中?“数据库文件导入excel表格数据库中...

    如何实现Excel表格自动导入到数据库 库?是什么数据库?sql?access?mysql?我以sql2008为例子 1.打开SQL Server Management Studio-任务-数据 2. ...

  7. oracle表中放入word,“如何将excel表格数据导入到oracle数据库对应的表中?“将excel表格导入word...

    如何将excel表格数据导入到oracle数据库对应的表中? 敢问楼主,表A几列,表B存在几列,表C存在几列 常规方法(表中列和excel中列) PLSQL 中 : select * from A u ...

  8. column ambiguously defined oracle数据库分页语句查询中select嵌套时出错

    column ambiguously defined &oracle数据库分页语句查询中select嵌套时出错 转载于 [ lev草梦的博客](http://blog.sina.com.cn/ ...

  9. ORACLE动态sql在存储过程中出现表或视图不存在的解决方法

    ORACLE动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN   ...

最新文章

  1. 旷视推出鼻纹识别,用AI寻找丢失宠物
  2. Java实现的简单神经网络(基于Sigmoid激活函数)
  3. matlab z变换离散化_MATLAB作图从入门到熟练
  4. CodeDom Assistant CodeDom的强大工具, 有些BUG修正了下,发到CodePlex,大家有需要的可以看看...
  5. 数据可视化(BI报表的开发)第一天
  6. 魔百盒哪款型号配置高_松下负离子吹风机怎么样哪款好?推荐型号?2020年9月松下负离子电吹风选购攻略...
  7. ACM常用数列(斐波那契数列、卡特兰数、贝尔数、斯特灵数)
  8. QT5开发及实例学习之十五Qt5位置相关函数
  9. 微信被指监听用户,腾讯回应;谷歌意外推送 Android 11 Beta 更新;Linux 5.7 发布 | 极客头条...
  10. 博思得标签打印机驱动_惠普LaserJet 5200n驱动-惠普HP LaserJet 5200n打印机驱动下载 v61.074.561.43官方版...
  11. 谷歌浏览器不兼容小于12px的字体,在做网页的时候怎么解决
  12. Nginx系列(7):Nginx高并发初探
  13. 深入浅出聊优化:从Draw Calls到GC(转)
  14. Java中的反射机制
  15. 计算机台式电源3c号,电源3C认证流程详情介绍
  16. 5月1日起入境新加坡可使用IATA通行证,五一假期新加坡亲子游攻略
  17. 一个失败的项目管理案例
  18. 如何正确的知晓生僻字发音?无需字典查询,2步手机设置轻松搞定
  19. 关于snipaste的网页长截屏(只能复制字或代码)
  20. 线性代数1.3行列式的按行展开

热门文章

  1. 【转】浅谈php://filter的妙用
  2. 基于 MongoDB 及 Spring Boot 的文件服务器的实现
  3. 解决ubuntu里面的sudo: /etc/sudoers is mode 0640, should be 0440
  4. 39条常见的Linux系统简单面试题
  5. Day 49 Nginx
  6. yum使用时 could not resolve host 报错的解决方法
  7. 【高危】Strurs2又现高危漏洞(附PocExp)
  8. 前端性能优化之jQuery按需加载轮播图
  9. 用onerror处理图片获取失败问题
  10. Objective-c——UI基础开发第十二天(相册展示)