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