PL/SQL集合(一):記錄類型(TYPE 類型名稱 IS RECORD)


記錄類型

  • 利用記錄類型可以實現復合數據類型的定義
  • 記錄類型允許嵌套
  • 可以直接利用記錄類型更新數據。

 

  • 傳統操作的問題
  • 對於Oracle數據類型,主要使用的是VARCHAR2NUMBERDATE等類型,但是這些基本數據類型,如果在進行一些實際操作的時候就會比較麻煩。

獲取一個雇員的完整信息:

如下數據類型被單獨定義.

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 ;

/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM