站保站

服务市场
  • 网站市场
  • 单机游戏
  • 平台大厅
  • 转让市场
  • 发卡市场
  • 广告市场
  • 下载市场
  • 收录市场
  • 本站平台
    平台客服
    微信Q群



    平台微博/weibo    平台微信/公众号    平台抖音/快手   
    曝光台    保障    地图   
    上传资源 快速赚钱
    站保站    登录      |  注册  |  

    只需一步,快速开始!

     找回密码   |   协议
    热门搜索: 网站开发 App报毒 挖矿源码 代办资质

    Oracle存储过程 自定义类型,集合读取

    • 时间:2020-10-26 09:45 编辑:i_jiebaby 来源: 阅读:28
    • 扫一扫,手机访问
    摘要:

    在实际应用场景中,需要通过存储过程解决批量录入,数据处理,批量返回的操作,且业务是实时的,即一次批量数据是一次性的。

    针对这个场景,考虑过以下方法:使用临时缓存表,将数据处理后存入,需要使用时读取并删除;从其他业务上环节批量录入或批量返回的压力

    而后确定批量一次数据量在200条内,此存储的调用比较频繁,存在被多处调用的情况。

    考虑实际,如果使用临时表频繁读写删数据,可能会出现锁数据的情况;在业务上通过其他环节来找补也是下策。

    最后确定了使用自定义数据类型和类型集合缓存处理好的数据,整体方案:将录入的格式约定成字符串,数据处理后缓存在集合,最后游标遍历集合返回数据。


    自定义数据格式类型

    -- 定义需要的数据类型,类似编程中的类
    create or replace Type Check_Record
    Is Object(P_Id NUMBER,V_Code Varchar2(2),V_Message NVARCHAR2(50))
    
    -- 定义类型的集合,类似编程中的列表
    create or replace Type PrescriptionCheck_Table  
    Is Table Of PrescriptionCheck_Record
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用自定义类型,并通过游标返回类型列表信息

    create or replace PROCEDURE p_check_refund_state (
        in_str   VARCHAR2, --输入字符串,格式:类型,ID;类型,ID...
        scur     OUT SYS_REFCURSOR -- 返回值
    ) IS
        --临时变量
        v_tempStr           VARCHAR(1000); -- 缓存解析字符串
        v_temp_in_str       VARCHAR(1000); -- 缓存输入字符串
        v_count_begin       int; -- 临时计数
        v_count_end         int; -- 临时计数
        v_type              NUMBER; --类型  检查申请 = 5,病理申请 = 6, 治疗申请 =7, 检验申请 = 8,手术申请 =9,用血申请 = 10,其他 = 99
        v_id                NUMBER; --ID
        v_code              VARCHAR(2); -- 返回值临时缓存
        v_message           VARCHAR(255); -- 返回信息临时缓存
        datatab             Check_Table := Check_Table(); -- 自定义类型的返回集合
        
    BEGIN
      IF(in_str IS NOT NULL AND LENGTH(in_str) > 0) THEN
        v_temp_in_str := in_str;
        LOOP --循环解析字符串
          datatab.extend;-- 扩充一条
          datatab(datatab.count) :=  Check_Record(-1,0,'传入第' || datatab.count || '条数据有误!');
          --判断‘;’有无,若无取全部字符串,反之前取到第一个分号前位置。
          IF(INSTR(v_temp_in_str,';',1,1) != 0) THEN
            v_tempStr := SUBSTR(v_temp_in_str,0,INSTR(v_temp_in_str,';',1,1));                            
          ELSE
            v_tempStr := v_temp_in_str;
          END IF;
    
          v_count_end := LENGTH(v_tempStr);
          
          --解析目标字符串
          
          --判断','进行类型与id的分取,
          IF(INSTR(v_tempStr,',',1,1) != 0) THEN
            v_count_begin := INSTR(v_tempStr,',',1,1);
            v_type := TO_NUMBER(SUBSTR(v_tempStr,0,v_count_begin-1));
            
            IF(INSTR(v_tempStr,';',1,1) != 0) THEN
              v_id := TO_NUMBER(SUBSTR(v_tempStr,v_count_begin+1,v_count_end-v_count_begin-1));
            ELSE
              v_id := TO_NUMBER(SUBSTR(v_tempStr,v_count_begin+1,v_count_end));
            END IF;
        
            -- 单条业务数据处理
            p_check_One_state(v_type,v_id,v_code,v_message);
            -- 将处理后数据放入自定义集合
            datatab(datatab.count) :=  Check_Record(v_id,v_code,v_message);
          END IF;
          
          v_count_begin := LENGTH(v_temp_in_str);
          --丢弃解析过的字符串
          IF(v_count_begin != v_count_end) THEN
            v_temp_in_str := SUBSTR(v_temp_in_str,v_count_end+1,v_count_begin);
          ELSE
            v_temp_in_str := '';
          END IF;
          
        EXIT WHEN v_temp_in_str IS NULL OR LENGTH(v_temp_in_str) = 0;
        END LOOP;
        
      END IF;
    
      -- 遍历集合,数据返回
      OPEN scur FOR SELECT * FROM table(datatab);
    -- 异常处理
    EXCEPTION
        WHEN OTHERS THEN
          OPEN scur FOR SELECT * FROM table(datatab);
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    过程中参考文章:

    plsql创建存储过程(二、使用游标返回多列值)

    Oracle存储过程中使用临时表的替代方案

    oracle中自定义type、以及java中传递list到过程中的例子

    • 全部评论(0)
    • 最新

    信息加载中,请等待

    微信客服(速回)

    微信客服(慢回)



    企业微信客服二维码
    联系我们
    平台客服: 平台QQ客服

    平台电话:400电话迁移中!

    平台邮箱:28292383@qq.com

    工作时间:周一至周五:早10:00 晚:18:00

    营业执照     网站ICP备案:鲁ICP备20027607号-1     鲁公网安备:37068702000078号     增值电信业务经营许可证、在线数据与交易处理业务许可证:鲁B2-20200681      © 2016-2024 站保站  https://www.zhanbaozhan.com/ 版权所有!      平台规范:   关于我们   广告合作   隐私条款   免责声明   法律声明   服务条款   网站地图   平台工单!