Oracle 创建、使用 Type

创建 Type (REC_APPLY_PREMIUM, REC_TAB_APPLY_PREMIUM)

可以用 java 的方式理解下面的 REC_APPLY_PREMIUM 和 REC_TAB_APPLY_PREMIUM
REC_APPLY_PREMIUM --> UserDomain
REC_TAB_APPLY_PREMIUM --> ArrayList

-- 文件: type_rec_apply_premium.sql
CREATE OR REPLACE TYPE NBUCDE."REC_APPLY_PREMIUM" FORCE AS Object(
       apply_bar_code         VARCHAR2(20),
       receivable_bal         NUMBER(15,2)
)
/
grant execute on NBUCDE.REC_APPLY_PREMIUM to NBUCDE;
grant execute on NBUCDE.REC_APPLY_PREMIUM to BIACDE;
grant execute on NBUCDE.REC_APPLY_PREMIUM to BIABOPR;
grant execute on NBUCDE.REC_APPLY_PREMIUM to BIAOPR;


-- 文件: type_rec_tab_apply_premium.sql
CREATE OR REPLACE TYPE NBUCDE."REC_TAB_APPLY_PREMIUM" AS TABLE OF nbucde.rec_apply_premium
/
grant execute on NBUCDE.REC_TAB_APPLY_PREMIUM to NBUCDE;
grant execute on NBUCDE.REC_TAB_APPLY_PREMIUM to BIACDE;
grant execute on NBUCDE.REC_TAB_APPLY_PREMIUM to BIABOPR;
grant execute on NBUCDE.REC_TAB_APPLY_PREMIUM to BIAOPR;

删除 Type (REC_APPLY_PREMIUM, REC_TAB_APPLY_PREMIUM)

-- 注意删除顺序: 这两个有引用关系
-- 先删除引用的 REC_TAB_APPLY_PREMIUM , 再删除被引用的 REC_APPLY_PREMIUM 

DROP TYPE NBUCDE."REC_TAB_APPLY_PREMIUM";

DROP NBUCDE."REC_APPLY_PREMIUM"

使用 Type (REC_APPLY_PREMIUM, REC_TAB_APPLY_PREMIUM)

--******************************************************************************
--功能说明: 根据银行代码和日期,获取对应保单号和首期应缴保费
--参数说明: p_date              日期 yyyyMMdd
--          p_bank_code        银行代码 如0002 建行, 0006交行
--输出结果: p_rec_apply_premium 对应保单和首期应缴保费数组
--需求号码: REQ-1663
--作者时间:  xuzh001 20180423
--******************************************************************************
PROCEDURE query_apply_premium (
      p_date        IN  VARCHAR2,
      p_bank_code         IN  VARCHAR2,   
-------------------------------- 使用 rec_tab_apply_premium
      p_rec_apply_premium OUT nbucde.rec_tab_apply_premium)
IS
    v_prompt    VARCHAR2(300);
    v_message   VARCHAR2(300);
    v_err_code  VARCHAR2(300);
-------------------------------- 使用 rec_apply_premium
    v_apply_premium_item  rec_apply_premium;
    CURSOR cur_apply_premium IS
    SELECT *
      FROM (
            SELECT uai.apply_bar_code, uai.receivable_bal
            FROM policy p, uw_apply_info uai
            WHERE 1=1
            AND p.apply_no = uai.apply_no
            AND p.department_no IN(
                SELECT t.dept_no 
                FROM DEPARTMENT_INFO t 
                connect BY prior t.dept_no = t.parent_dept 
                start with t.dept_no = p_bank_code)
            AND p.business_source = '2'
            AND to_char(p.issue_date, 'yyyyMMdd') = decode(p_date, null, to_char(p.issue_date, 'yyyyMMdd'), p_date)
    )ta
    ORDER BY apply_bar_code, receivable_bal
    ;
    v_apply_premium cur_apply_premium%ROWTYPE;
    v_count INT := 0;
BEGIN
-------------------------------- 使用 rec_tab_apply_premium
    p_rec_apply_premium := NEW nbucde.rec_tab_apply_premium();
-------------------------------- 使用 rec_apply_premium
    v_apply_premium_item := NEW rec_apply_premium(null,null);
    FOR v_apply_premium IN cur_apply_premium LOOP
        v_apply_premium_item.apply_bar_code := v_apply_premium.apply_bar_code;
        v_apply_premium_item.receivable_bal := v_apply_premium.receivable_bal;
        v_count := v_count + 1;
        p_rec_apply_premium.EXTEND;
        p_rec_apply_premium(v_count) := v_apply_premium_item;
    END LOOP;
EXCEPTION
  WHEN OTHERS THEN
     v_message := substrb('query_apply_premium',
                          1,
                          300);
     v_err_code := NULL;
     pub_error_handle.exception_no_raise('check_unsure_clientInfo_rule2',
                                         v_err_code,
                                         v_message,
                                         v_prompt);
END query_apply_premium;

type / create type 区别联系

相同:
    可用用关键字create type 或者直接用type定义自定义类型,

区别:
    1. create type 变量 as table of 类型
    2. create type 变量 as object(字段1 类型1, 字段2 类型2);
    3. type 变量 is table of 类型
    4. type 变量 is record(字段1 类型1, 字段2 类型2);

用 create 后面用 as , 若直接用 type 后面用 is
create 是创 object , 而 type 是创 record