Oracle数据库游标在存储过程中的使用-阿里云开发者社区

开发者社区> 寒凝雪> 正文

Oracle数据库游标在存储过程中的使用

简介:
+关注继续查看
作为关系型数据库市场的老大,Oracla占有举足轻重的地位。虽然在操作上不如SQLSERVER那样方便,但是他的强大的功能还是吸引来大批大批的追随着。本人作为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,         --库管编号
                 ConfirmStatechar,              --确认状态
                 ExistStatechar,                    --存在状态
                 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;
            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=nullWHERE 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_IDin(InlayBoxIDs);
      v_sql :='UPDATE T_InlayBox SET F_State=3,F_InlayOutID='||FID||' WHERE F_ID in ('||InlayBoxIDs||')';
       --立即执行v_sql
      EXECUTE 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;
     --发生异常时返回错误码
     EXCEPTION
        WHEN OTHERS THEN
        strErr := substr(sqlerrm,1,100);
        ROLLBACK;
END sp_EditInlayOut;

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

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


本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
.NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)
6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)    【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.
730 0
.NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)
6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)      【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.
770 0
尽量使用写文本方式存储数据(pandas 和 file write效率对比)
尽量使用写文本方式存储数据(pandas 和 file write效率对比)
11 0
在ArcGIS中如何使用直连方式连接Oracle数据库
1.      背景 直连方式比使用SDE方式更加稳定,特别是在大数据量处理的应用中,不易出场由SDE连接进程造成的gsvr错误。
1054 0
JDBC调用存储过程,以及存储过程 事务的使用.....
在JDBC中调用存储过程 首先就要在数据库中存在 要调用的过程  ,存储过程是一组SQL语句的集合,我们吧实现某一功能的 SQL语句集合在一起来使用,方便了用户,不光是这样,存储过程可以预编译,也就是说只要调用了一次存储过程,那么下次在调用存储过程的时候 就不需要进行再次编译了  。
824 0
Sql Server 存储过程使用技巧
1、创建带Try。。。Catch的存储过程模板   Copy下面的代码,然后新建查询,就可以写sql语句,执行完后,一个你自己的存储过程就建立好了! USE [DB]--设定对应的数据库 GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER O...
689 0
数据库存储图像及使用Image控件显示
在数据库中存取并显示到页面Image控件的功能。原来认为并不复杂,但是实际中却遇到了一些问题。 首先来看看保存图片: 图片在数据库中使用二进制方式存储,所以要把图片转化为二进制流文件在存储到数据库中,代码如下:     private void Save()     {         MyImage img = new MyImage();         img.
675 0
SQL使用链接服务器执行远程数据库上的存储过程
原文:SQL使用链接服务器执行远程数据库上的存储过程   --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin'server_tmp','fa...
1186 0
+关注
5854
文章
223
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载