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 ;

/

 

 

posted @ 2017-08-28 18:03  寻香径  阅读(5985)  评论(0编辑  收藏  举报