PL/SQL:记录 / 集合例子

  
  
  1. CREATE OR REPLACE PROCEDURE test_gj_record_collection(
  2. IV_ZZJG_ID IN VARCHAR2,
  3. IV_QY_ID IN VARCHAR2,
  4. iv_sbym IN VARCHAR2
  5. ) AS
  6. V_ROWCNT NUMBER := 0; --计数器
  7. v_err_code varchar2(20); --错误代码 Y:错误 N:正确 --gaoj add 20160505
  8. v_err_msg varchar2(4000); --错误信息 无错误 --gaoj add 20160505
  9. v_ocur_msg SYS_REFCURSOR ;
  10. -- 写法1: 集合 + 使用定义变量(简单)写法
  11. v_bbname VARCHAR2(50) := ' ';
  12. v_bbcode VARCHAR2(30) := ' ';
  13. v_ssq varchar2(6) := ' ';
  14. v_no varchar2(4) := ' ';
  15. v_msg2 varchar2(200) := ' ';
  16. v_flag2 varchar2(1) := ' ';
  17. -- 写法2: 集合 + record写法
  18. TYPE R2 IS RECORD ( --定义记录类型
  19. v_bbname VARCHAR2(50) ,
  20. v_bbcode VARCHAR2(30) ,
  21. v_ssq varchar2(6) ,
  22. v_no varchar2(4) ,
  23. v_msg2 varchar2(200) ,
  24. v_flag2 varchar2(1) );
  25. record_r2 R2 ; --定义记录变量
  26. -- 写法3: 集合 + %rowtype
  27. -- TYPE .. IS RECORD
  28. TYPE R3 IS RECORD ( --定义记录类型
  29. v_bbname VARCHAR2(50) ,
  30. v_bbcode VARCHAR2(30) ,
  31. v_ssq varchar2(6) ,
  32. v_no varchar2(4) ,
  33. v_msg2 varchar2(200) ,
  34. v_flag2 varchar2(1) );
  35. TYPE t3 IS TABLE OF R3;
  36. table_t3 t3;
  37. BEGIN
  38. DELETE FROM tt_chk_err; --清理临时表
  39. pkg_sc_jc_sjyzx.p_chk_mxhz(IV_ZZJG_ID, IV_QY_ID, v_err_code, v_err_msg, v_ocur_msg);
  40. if v_err_code = 'Y' then
  41. insert into TT_WM_QRMX_QR (msg)
  42. values ('调用 P_CHK_MXHZ 出现异常'||substr(v_err_msg,0,150));
  43. return;
  44. end if;
  45. -- 写法1:使用定义变量(简单)写法
  46. LOOP
  47. FETCH v_ocur_msg INTO v_bbname, v_bbcode, v_ssq, v_no, v_msg2, v_flag2;
  48. exit when v_ocur_msg%notfound;
  49. IF ( nvl(v_msg2,' ') <> ' ' AND v_ssq = iv_sbym ) THEN
  50. v_rowcnt := v_rowcnt + 1;
  51. END IF;
  52. END LOOP;
  53. -- 写法2:使用 record写法
  54. LOOP
  55. FETCH v_ocur_msg INTO record_r2;
  56. exit when v_ocur_msg%notfound;
  57. IF ( nvl(record_r2.v_msg2,' ') <> ' ' AND record_r2.v_ssq = iv_sbym ) THEN
  58. v_rowcnt := v_rowcnt + 1;
  59. END IF;
  60. END LOOP;
  61. -- 写法3: 集合 + record
  62. FOR src IN table_t3.first .. table_t3.last LOOP
  63. exit when v_ocur_msg%notfound;
  64. IF (nvl(table_t3(src).v_msg2,' ') <> ' ' AND table_t3(src).v_ssq = iv_sbym) THEN
  65. v_rowcnt := v_rowcnt + 1;
  66. END IF;
  67. END LOOP;
  68. IF v_rowcnt > 0 THEN
  69. insert into TT_WM_QRMX_QR(bmc, msg)
  70. SELECT ' ' BMC,
  71. '汇总计算有'||v_rowcnt||'条记录与明细数据不符,请进行<数据一致性检查>' MSG
  72. FROM DUAL;
  73. END IF;
  74. EXCEPTION
  75. WHEN OTHERS THEN
  76. NULL;
  77. end;
  78. /
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值