-
为什么需要记录类型
- 示例1:定义过程,输出一个雇员的完整信息
| ||
为了保留查询出的多个数值结果,需要定义多个变量。我们需要一个类型包含多个数据。 |
-
记录类型
- Oracle可以使用类似Java类结构体,语法:
TYPE 类型名称 IS RECODE( 成员名称数据类型 [[NOT NULL] [:=默认值] 表达式 ], ... ); |
定义了新的结构,该结构和基本数据类型一样,需要定义一个此记录类型的变量后,用户才可以使用 |
注意:编写顺序 |
- 示例1:修改上例,使用记录类型接收查询返回结果
| ||
问题:使用记录类型和"表%ROWTYPE"有什么区别 |
- 示例2:以上是通过查询字段的方式为记录类型赋值,用户也可以自己设置记录类型中的成员数据
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 := 'MLDN ' ; -- 为记录类型成员赋值 v_dept.loc := '北京' ; -- 为记录类型成员赋值 DBMS_OUTPUT.put_line('部门编号:' || v_dept.deptno || ',名称:' || v_dept.dname || ',位置:' || v_dept.loc) ; END ; / | 运行结果: |
- 示例3:定义嵌套的记录类型
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 ; / | 运行结果: 雇员编号:7369,姓名:SMITH,职位:CLERK,雇佣日期:1980-12-17,基本工资:800,佣金:0 部门编号:20,名称:RESEARCH,位置:DALLAS |
- 示例4:增加一条新的记录,利用记录类型保存数据
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 := 'MLDN' ; v_dept.loc := '北京' ; v_dept.deptno := 80 ; INSERT INTO dept VALUES v_dept ; -- 直接插入记录类型的数据 END ; / |
在使用记录类型直接执行更新时,定义的记录类型中的成员顺序要与操作数据表的字段顺序保持一致,否则无法使用 |
- 示例5:修改数据,利用记录类型保存数据
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 := 'MLDNJAVA' ; v_dept.loc := '中国' ; v_dept.deptno := 80 ; UPDATE dept SET ROW=v_dept WHERE deptno=v_dept.deptno ; END ; / |
在使用记录类型更新时,只需要在更新语句后写上ROW,就可以找到dname和loc,但是对于更新主键的限定条件,则还需要在where子句中编写 |