PL/SQL集合(一):记录类型(TYPE 类型名称 IS RECORD)
记录类型
- 利用记录类型可以实现复合数据类型的定义;
- 记录类型允许嵌套;
- 可以直接利用记录类型更新数据。
- 传统操作的问题
- 对于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)的更多相关文章
- pl/sql developer 设置oracle的date类型默认显示样式
oracle里默认的date显示样式: 我的是汉化过的: 进入后,点击工具->首选项->日期/时间设置即可: 设置后在pl/sql developer中查看: 英文版的操作步骤: Tool ...
- PL/SQL — 集合及常用方法
PL/SQL中提供了常用的三种集合联合数组.嵌套表.变长数组,而对于这几个集合类型中元素的操作,PL/SQL提供了相应的函数或过程来操纵数组中的元素或下标.这些函数或过程称为集合方法.一个集合方法就是 ...
- PL/SQL集合 ----- varrays
varrays可以再表,记录,对象定义中使用,类似于C中的数组. 1.定义varrays用作PL/SQL程序构造块. declare type integer_varray ) of integer; ...
- Oracle错误(包括PL/SQL)集合与修复
+-----------------------------------------------------------------------+ | 在本篇随笔中,仅根据个人经验累积错误进行描述 ...
- Oracle pl/sql 记录、表类型
一.PL/SQL记录 定义: TYPE <类型名> IS RECORD <列名1 类型1,列名2 类型2,...列名n 类型n,> [NOT NULL] <列的类型> ...
- PL/SQL 编程(一)基础,变量,分支,循环,异常
SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL).可以方便的调用相应语句来 ...
- PL/SQL详细介绍,设置oracle相关
1. 实现参照完整性 指若两个表之间具有主从关系(即主外键关系),当删除主表数据时,必须确保相关的从表数据已经被删除. 当修改主表的主键列数据时,必须确保相关从表数据已经被修改.为了实现级 ...
- Oracle的pl/sql变量类型
pl/sql定义 sql是结构化查询语言.sql是不是一个编程语言?编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言.我们在实际的开发中,有这种需要,把s ...
- Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...
随机推荐
- Eclipse/MyEclipse全屏插件
此插件可以让Eclipse/MyEclipse的界面全屏,隐藏菜单栏和状态栏! MyEclipse 2014/2015中亲测有效! 插件下载: http://files.cnblogs.com/got ...
- vs2013+MVC3.0+EasyUI的ComboBox联动使用(二)
vs2013+MVC3.0+EasyUI的ComboBox联动使用(二) 简单介绍:在vs2013(.net4.0)中使用MVC3.0对于EasyUI中ComboBox的联动使用. 载入Comb ...
- CentOS安装Emacs文本编辑器
我这里安装的是:emacs.24.2 下载地址:http://ftp.gnu.org/pub/gnu/emacs/emacs-24.2.tar.gz 下载文件:emacs-24.2.tar.gz 步骤 ...
- 弹窗插件zDialog使用教程
1.首先现在好zDialog然后复制项目中 2.配置zDialog解压以后images文件夹位置 images存放位置根据自己实际项目而定,zDialog.js中配置位置即可,如: var IMAGE ...
- Unity3D使用经验总结 编辑器扩展篇【转】
一个引擎,最重要的就是工具,工具除了提升开发速度,提供可视化操作环境以外,还带了容错功能. 它使得大家的工作局限在一定的范围内,比如一个变量的配置,或者是一些类型的选择. 使用编辑器,使得既使不太明白 ...
- ChemDraw 16最新版本发布 更效率科研的首选
ChemDraw一直是全球领先的科学绘图软件,致力于为科学家.教师以及学生提供最新的智能应用程序.ChemDraw 16版本相较于15版本做出了较大的改进,大大缩短科研时间,提高科研效率.扩展Name ...
- web开发中的安全问题
web开发中很多东西由前段来负责判断,比如常见的邮箱 电话号码,前端判断到不是一个正确的格式,在你点击提交时候提示你格式填错了,然后不请求后端php,直到你填写正确的格式为止.这种其实可以修改js或者 ...
- Python 入门(九)迭代
什么是迭代 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration). 在Python中,迭代是通过 for ...
- iOS开发 - 检测网络状态(WIFI、2G/3G/4G)
本文转载至 http://blog.csdn.net/wangzi11322/article/details/45580917 检测网络状态 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是 ...
- iOS事件拦截(实现触摸任意位置隐藏指定view)
项目里有一个需求,类似新浪或者腾讯微博的顶部title栏的类别选择器的消失(在选择器展开的时候,触摸屏幕任何地方使其消失). 最开始的想法是当这个选择器(selectorView)展开的时候,在当前屏 ...