您的位置:首页 > 数据库

PL/SQL:记录 / 集合例子

2017-07-17 10:29 357 查看
CREATE OR REPLACE PROCEDURE test_gj_record_collection(

IV_ZZJG_ID  IN VARCHAR2,

IV_QY_ID    IN VARCHAR2,

iv_sbym     IN VARCHAR2

) AS

V_ROWCNT NUMBER := 0; --计数器


v_err_code    varchar2(20); --错误代码 Y:错误 N:正确    --gaoj add 20160505

v_err_msg     varchar2(4000); --错误信息 空 无错误      --gaoj add 20160505

v_ocur_msg    SYS_REFCURSOR ;


-- 写法1: 集合 + 使用定义变量(简单)写法

v_bbname       VARCHAR2(50) := ' ';

v_bbcode       VARCHAR2(30) := ' ';

v_ssq          varchar2(6) := ' ';

v_no           varchar2(4) := ' ';

v_msg2         varchar2(200) := ' ';

v_flag2        varchar2(1) := ' ';



-- 写法2: 集合 + record写法

TYPE R2 IS RECORD (  --定义记录类型

v_bbname      VARCHAR2(50) ,

v_bbcode      VARCHAR2(30) ,

v_ssq         varchar2(6) ,

v_no          varchar2(4) ,

v_msg2        varchar2(200) ,

v_flag2       varchar2(1) );

record_r2 R2 ;     --定义记录变量



-- 写法3: 集合 + %rowtype

-- TYPE .. IS RECORD

TYPE R3 IS RECORD (  --定义记录类型

v_bbname      VARCHAR2(50) ,

v_bbcode      VARCHAR2(30) ,

v_ssq         varchar2(6) ,

v_no          varchar2(4) ,

v_msg2        varchar2(200) ,

v_flag2       varchar2(1) );


TYPE t3 IS TABLE OF R3;

table_t3 t3;


BEGIN

DELETE FROM tt_chk_err; --清理临时表


pkg_sc_jc_sjyzx.p_chk_mxhz(IV_ZZJG_ID, IV_QY_ID, v_err_code, v_err_msg, v_ocur_msg);

if v_err_code = 'Y' then

insert into TT_WM_QRMX_QR (msg)

values ('调用 P_CHK_MXHZ 出现异常'||substr(v_err_msg,0,150));

return;

end if;


-- 写法1:使用定义变量(简单)写法

LOOP

FETCH v_ocur_msg INTO v_bbname,  v_bbcode,  v_ssq,  v_no,  v_msg2,  v_flag2;

exit when v_ocur_msg%notfound;

IF ( nvl(v_msg2,' ') <> ' ' AND v_ssq = iv_sbym )  THEN

v_rowcnt := v_rowcnt + 1;

END IF;

END LOOP;



-- 写法2:使用 record写法

LOOP

FETCH v_ocur_msg INTO record_r2;

exit when v_ocur_msg%notfound;

IF ( nvl(record_r2.v_msg2,' ') <> ' ' AND record_r2.v_ssq = iv_sbym ) THEN

v_rowcnt := v_rowcnt + 1;

END IF;

END LOOP;



-- 写法3: 集合 + record

FOR src IN table_t3.first .. table_t3.last LOOP

exit when v_ocur_msg%notfound;

IF (nvl(table_t3(src).v_msg2,' ') <> ' ' AND table_t3(src).v_ssq = iv_sbym)  THEN

v_rowcnt := v_rowcnt + 1;

END IF;

END LOOP;


IF v_rowcnt > 0 THEN

insert into TT_WM_QRMX_QR(bmc, msg)

SELECT ' ' BMC,

'汇总计算有'||v_rowcnt||'条记录与明细数据不符,请进行<数据一致性检查>' MSG

FROM DUAL;

END IF;


EXCEPTION

WHEN OTHERS THEN

NULL;

end;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle plsql SQLPLSQL