记录类型

  • 利用记录类型可以实现复合数据类型的定义;
  • 记录类型允许嵌套;
  • 可以直接利用记录类型更新数据。
  • 传统操作的问题
  • 对于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 ;

/

PL/SQL集合(一):记录类型(TYPE 类型名称 IS RECORD)的更多相关文章

  1. pl/sql developer 设置oracle的date类型默认显示样式

    oracle里默认的date显示样式: 我的是汉化过的: 进入后,点击工具->首选项->日期/时间设置即可: 设置后在pl/sql developer中查看: 英文版的操作步骤: Tool ...

  2. PL/SQL — 集合及常用方法

    PL/SQL中提供了常用的三种集合联合数组.嵌套表.变长数组,而对于这几个集合类型中元素的操作,PL/SQL提供了相应的函数或过程来操纵数组中的元素或下标.这些函数或过程称为集合方法.一个集合方法就是 ...

  3. PL/SQL集合 ----- varrays

    varrays可以再表,记录,对象定义中使用,类似于C中的数组. 1.定义varrays用作PL/SQL程序构造块. declare type integer_varray ) of integer; ...

  4. Oracle错误(包括PL/SQL)集合与修复

    +-----------------------------------------------------------------------+ |   在本篇随笔中,仅根据个人经验累积错误进行描述 ...

  5. Oracle pl/sql 记录、表类型

    一.PL/SQL记录 定义: TYPE <类型名> IS RECORD <列名1 类型1,列名2 类型2,...列名n 类型n,> [NOT NULL] <列的类型> ...

  6. PL/SQL 编程(一)基础,变量,分支,循环,异常

    SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL).可以方便的调用相应语句来 ...

  7. PL/SQL详细介绍,设置oracle相关

    1. 实现参照完整性      指若两个表之间具有主从关系(即主外键关系),当删除主表数据时,必须确保相关的从表数据已经被删除.  当修改主表的主键列数据时,必须确保相关从表数据已经被修改.为了实现级 ...

  8. Oracle的pl/sql变量类型

    pl/sql定义 sql是结构化查询语言.sql是不是一个编程语言?编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言.我们在实际的开发中,有这种需要,把s ...

  9. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...

随机推荐

  1. python PIL 库处理文件

    通过PIL库提供的API接口可以很方便的处理图像,功能十分强大: 最近有一个替换png背景色的需求,替换背景色的同时又不能够覆盖原来的文字,之前利用perl 的CD 模块一直没能够正确处理,最终用PI ...

  2. c++ 转化

    atof(将字符串转换成浮点型数)相关函数atoi,atol,strtod,strtol,strtoul表头文件#include定义函数double atof(const char *nptr);函数 ...

  3. 学习 TList 类的实现[2]

    我原来以为 TList 可能是一个链表, 其实只是一个数组而已. 你知道它包含着多大一个数组吗? MaxListSize 个!MaxListSize 是 Delphi 在 Classes 单元定义的一 ...

  4. javaScript实现归并排序

    归并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子.有这样一组数据: {5,4,1,22,12,32,45,21} 如果对它进行归并排序的话, ...

  5. MathType公式保存后为什么字体会变化

    在使用MathType数学公式编辑器的时候,很多的用户朋友是新手会遇到一些问题,比如,有时我们保存后却发现MathType公式字体变化了,原本的斜体变成了正体,面对这种问题我们该如何解决呢?下面就来给 ...

  6. 生成验证码程序C#

    using System; using System.Data; using System.Configuration; using System.Collections; using System. ...

  7. linux 数据盘和系统盘的查看

    系统盘就像linux的c盘,使用df -l命令查看 如下所示: 可以看到根路径 / 都是位于系统盘.而/root,/home,/usr就如同c盘下的c:\windows,c:\usr这些目录 如果单独 ...

  8. Maven配置默认使用的JDK版本

    问题: 创建maven项目的时候,jdk版本是1.7版本,而自己安装的是1.8版本,从而导致无法使用lambda等Java8新特性. 每次右键项目名-maven->update project ...

  9. 超全面的JavaWeb笔记day01<HTML等>

    1.html简介 - html的操作思想(*****) 2.文字标签和注释标签 3.标题标签.水平线标签和特殊字符 4.列表标签 5.图像标签(********) 6.路径介绍(相对路径*****) ...

  10. org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException)

    在运行hadoop的程序时,向hdfs中写文件时候,抛出异常信息如下: Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hado ...