zoukankan      html  css  js  c++  java
  • Oracle 存储过程procedure之数据更新-游标

    在日常工作中,经常会碰到后台外导一批数据,并将外导数据处理至系统表中的情况。

    面临这种情况,我一般采用写存储过程批处理的方式完成,写好一次以后,再次有导入需求时,只需要将数据导入到中间表,然后执行存储过程就搞定了。

    以下是更新某个基础类型表(有上下自关联)的存储语句:

    CREATE OR REPLACE PROCEDURE BSS_LS.PRO_IMP_RESPONSIBILITY
    IS
       CURR_PARENT_ID     INT;
       CURR_PARENT_NAME   VARCHAR (200);
       CURR_NAME          VARCHAR (200);
       CURR_REMARK        VARCHAR (500);
    
       CURSOR RESP_CUR
       IS
          SELECT ONE, TWO, THREE FROM FOR_RESPONSIBILITY; --声明游标,表FOR_RESPONSIBILITY为外导的中间表
    
    BEGIN
       OPEN RESP_CUR; --打开游标
    
       LOOP --遍历游标
          FETCH RESP_CUR --遍历游标中每行字段值到对应的变量中
             INTO CURR_PARENT_NAME, CURR_NAME, CURR_REMARK;
    
          EXIT WHEN RESP_CUR%NOTFOUND; --遍历完毕 退出
    
          SELECT MAX (ID)
            INTO CURR_PARENT_ID
            FROM BSS_RESPONSIBILITY_BAK
           WHERE NAME = CURR_PARENT_NAME; --查找上级ID
    
          IF CURR_PARENT_ID > 0 --找到ID,表BSS_RESPONSIBILITY_BAK为系统表
          THEN
             INSERT INTO BSS_RESPONSIBILITY_BAK (ID,
                                                 PARENT_ID,
                                                 NAME,
                                                 IS_USE,
                                                 REMARK)
                  VALUES (BSS_RESPONSIBILITY_SEQ.NEXTVAL,
                          CURR_PARENT_ID,
                          CURR_NAME,
                          1,
                          CURR_REMARK);
          ELSE --未找到
             SELECT BSS_RESPONSIBILITY_SEQ.NEXTVAL INTO CURR_PARENT_ID FROM DUAL;
    
             INSERT INTO BSS_RESPONSIBILITY_BAK (ID, NAME, IS_USE)
                  VALUES (CURR_PARENT_ID, CURR_PARENT_NAME, 1);
    
             INSERT INTO BSS_RESPONSIBILITY_BAK (ID,
                                                 PARENT_ID,
                                                 NAME,
                                                 IS_USE,
                                                 REMARK)
                  VALUES (BSS_RESPONSIBILITY_SEQ.NEXTVAL,
                          CURR_PARENT_ID,
                          CURR_NAME,
                          1,
                          CURR_REMARK);
    
             COMMIT;
          END IF;
       END LOOP; --结束遍历游标
    
       CLOSE RESP_CUR; --关闭游标
    EXCEPTION
       WHEN OTHERS
       THEN
          ROLLBACK;
          RAISE;
    END;
    /

    PS:游标的使用

    游标声明方式有两种:

    一、CURSOR  游标名 IS  select查询语句;

    CURSOR your'sCursor IS select * from table

    二、类型游标

    TYPE my_cur_type IS REF CURSOR; -- 自定义一个游标类型
    _cur my_cur_type ; -- 游标类型变量_cur
    
    -- ...
    OPEN _cur FOR select * from table; LOOP FETCH _cur INTO _cur_id; EXIT WHEN _cur%NOTFOUND; -- insert update select delete 等操作 END LOOP; CLOSE _cur;

    游标的行变量声明

    --定义一个游标的行变量
     _cur_row  _cur%rowtype;
    
    --使用行中的值
    fetch _cur into _cur_row;
    _cur_row.xx1、 _cur_row.xx2
     
  • 相关阅读:
    Fiddler 教程
    Android 利用 aapt 解析 apk 得到应用名称 包名 版本号 权限等信息
    Android获取Manifest中<meta-data>元素的值
    Android资源混淆保护实践
    Android中捕获TTextView文本中的链接点击事件方法
    Android APK 手动命令编译、打包、签名步骤
    Android签名总结
    软件概要设计模板
    整理了一份React-Native学习指南
    appium简明教程(转)
  • 原文地址:https://www.cnblogs.com/senyier/p/6611478.html
Copyright © 2011-2022 走看看