記錄類型
- 利用記錄類型可以實現復合數據類型的定義;
- 記錄類型允許嵌套;
- 可以直接利用記錄類型更新數據。
- 傳統操作的問題
- 對於Oracle數據類型,主要使用的是VARCHAR2、NUMBER、DATE等類型,但是這些基本數據類型,如果在進行一些實際操作的時候就會比較麻煩。
獲取一個雇員的完整信息:
如下數據類型被單獨定義.
| DECLARE v_emp_empno emp.empno%TYPE ; v_emp_ename emp.ename%TYPE ; v_emp_job emp.job%TYPE ; v_emp_hiredate emp.hiredate%TYPE ; v_emp_sal emp.sal%TYPE ; v_emp_comm emp.comm%TYPE ; BEGIN v_emp_empno := &inputempno ; SELECT ename,job,hiredate,sal,comm INTO v_emp_ename,v_emp_job,v_emp_hiredate,v_emp_sal,v_emp_comm FROM emp WHERE empno=v_emp_empno ; DBMS_OUTPUT.put_line('雇員編號:' || v_emp_empno || ',姓名:' || v_emp_ename || ',職位:' || v_emp_job || ',雇佣日期:' || TO_CHAR(v_emp_hiredate,'yyyy-mm-dd') || ',基本工資:' || v_emp_sal || ',佣金:' || NVL(v_emp_comm,0)) ; EXCEPTION WHEN others THEN RAISE_APPLICATION_ERROR(-20007,'此雇員信息不存在!') ; END ; / |
- 定義新類型
- 定義記錄類型
| TYPE 類型名稱 IS RECORD ( 成員名稱 數據類型 [[NOT NULL] [:= 默認值] 表達式] , ... 成員名稱 數據類型 [[NOT NULL] [:= 默認值] 表達式] ) ; |
ROWTYPE只能夠根據已有表來決定復合類型
記錄類型可以由用戶自定義組成.
| 使用記錄類型接收查詢返回結果 注意使用逗號. |
| DECLARE v_emp_empno emp.empno%TYPE ; TYPE emp_type IS RECORD ( ename emp.ename%TYPE , job emp.job%TYPE , hiredate emp.hiredate%TYPE , sal emp.sal%TYPE , comm emp.comm%TYPE ) ; v_emp emp_type ; -- 定義一個指定的復合類型變量 BEGIN v_emp_empno := &inputempno ; SELECT ename,job,hiredate,sal,comm INTO v_emp FROM emp WHERE empno=v_emp_empno ; DBMS_OUTPUT.put_line('雇員編號:' || v_emp_empno || ',姓名:' || v_emp.ename || ',職位:' || v_emp.job || ',雇佣日期:' || TO_CHAR(v_emp.hiredate,'yyyy-mm-dd') || ',基本工資:' || v_emp.sal || ',佣金:' || NVL(v_emp.comm,0)) ; EXCEPTION WHEN others THEN RAISE_APPLICATION_ERROR(-20007,'此雇員信息不存在!') ; END ; / |
| 用戶自己操作記錄類型數據 這個時候沒有通過查詢,直接聲明變量,然后為屬性賦值. |
| DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE := 80, -- 定義默認值 dname dept.dname%TYPE , loc dept.loc%TYPE ) ; v_dept dept_type ; BEGIN v_dept.dname := 'scent' ; -- 為記錄類型成員賦值 v_dept.loc := '重慶' ; -- 為記錄類型成員賦值 DBMS_OUTPUT.put_line('部門編號:' || v_dept.deptno || ',名稱:' || v_dept.dname || ',位置:' || v_dept.loc) ; END ; / |
| 定義嵌套的記錄類型 這是一種面向對象的方式 |
| DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE := 80, -- 定義默認值 dname dept.dname%TYPE , loc dept.loc%TYPE ) ; TYPE emp_type IS RECORD ( empno emp.empno%TYPE , ename emp.ename%TYPE , job emp.job%TYPE , hiredate emp.hiredate%TYPE , sal emp.sal%TYPE , comm emp.comm%TYPE , dept dept_type ) ; v_emp emp_type ; BEGIN SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.comm,d.deptno,d.dname,d.loc INTO v_emp.empno,v_emp.ename,v_emp.job,v_emp.hiredate,v_emp.sal,v_emp.comm, v_emp.dept.deptno,v_emp.dept.dname,v_emp.dept.loc FROM emp e,dept d WHERE e.deptno=d.deptno(+) AND e.empno=7369 ; DBMS_OUTPUT.put_line('雇員編號:' || v_emp.empno || ',姓名:' || v_emp.ename || ',職位:' || v_emp.job || ',雇佣日期:' || TO_CHAR(v_emp.hiredate,'yyyy-mm-dd') || ',基本工資:' || v_emp.sal || ',佣金:' || NVL(v_emp.comm,0)) ; DBMS_OUTPUT.put_line('部門編號:' || v_emp.dept.deptno || ',名稱:' || v_emp.dept.dname || ',位置:' || v_emp.dept.loc) ; END ; / |
| 增加一條新的記錄,利用記錄類型保存數據 |
| DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE , dname dept.dname%TYPE , loc dept.loc%TYPE ) ; v_dept dept_type ; BEGIN v_dept.dname := 'gaga' ; v_dept.loc := 'chongqing' ; v_dept.deptno := 80 ; INSERT INTO dept VALUES v_dept ; -- 直接插入記錄類型的數據 END ; / |
| 如果不需要插入全表數據,也可以插入指定欄位的數據 |
| DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE , dname dept.dname%TYPE ) ; v_dept dept_type ; BEGIN v_dept.dname := 'wendy' ; v_dept.deptno := 90 ; INSERT INTO dept(deptno,dname) VALUES (v_dept.deptno,v_dept.dname) ; -- 直接插入記錄類型的數據 END ; / |
| 修改數據,利用記錄類型保存數據 |
| DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE , dname dept.dname%TYPE , loc dept.loc%TYPE ) ; v_dept dept_type ; BEGIN v_dept.dname := 'yaya' ; v_dept.loc := '中國' ; v_dept.deptno := 90 ; UPDATE dept SET ROW=v_dept WHERE deptno=v_dept.deptno ; END ; / |
