Oracle之PL/SQL学习笔记之数据类型(三)
所有的编程语言中变量是使用最频繁的。PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分。
1. Oracle预定义的普通数据类型(常见的数据类型)
类型 | 子类 | 说明 |
Oracle中的范围 |
char |
Character,String Rowid,Nchar |
定长字符串 民族字符集 |
2000(缺省值1) |
varchar2 | varchar,String ,Nvarchar2 |
可变字符串 民族语言字符集 |
4000 |
Binary_integer |
带符号整数,为整数计算优化性能 | ||
number(s,p) |
double,integer,int | ||
Long | 变长字符串 | 32767 | |
date | 日期型 | ||
ROWID | 存放数据库行号 | ||
URowid | 通用行标识符,字符串类型 |
2. 复合类型
Oracle在PL/SQL中除了提供像前面介绍的各种类型外,还提供一种称为复合类型的类型:
记录和表
2.1 使用%type
我们先看下面的例子:
declare
c_ename constant varchar2(50):='KING';
v_job varchar2(50);
-----------------------------------------------
--备注:通过雇员姓名查找雇员的职称
-----------------------------------------------
begin
select job into v_job from emp where ename=c_ename;
dbms_output.put_line('雇员'||c_ename||'的职称为:'||v_job);
end;
假如现在emp表的job字段长度为20 ,我们使用varchar2(50)来接收job的值可以,如果我们修改emp表结构,job字段的长度为varchar2(100),那么是不是有可能
我们的v_job varchar2(50) 长度不够存储job列的值,会报异常:numeric or value error: character string buffer too small
那我们怎么来避免这种情况呢?我们看下修改后的代码:
declare
c_ename constant varchar2(50):='KING';
v_job emp.job%type;
-----------------------------------------------
--备注:通过雇员姓名查找雇员的职称
-----------------------------------------------
begin
select job into v_job from emp where ename=c_ename;
dbms_output.put_line('雇员'||c_ename||'的职称为:'||v_job);
end;
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据相同,这时可以使用%type
使用%type特性的优点在于:
所引用的数据库列的数据类型可以不必知道
所引用的数据库列的数据类型可以实时改变
实例:
declare
c_ename constant varchar2(50):='KING';
v_job emp.job%type;
v_deptno emp.deptno%type;
-----------------------------------------------
--备注:通过雇员姓名查找雇员的职称,与部门编号
-----------------------------------------------
begin
select job,deptno into v_job,v_deptno from emp where ename=c_ename;
dbms_output.put_line('雇员'||c_ename||'的职称为:'||v_job||',部分编号为:'||v_deptno);
end;
上面查询出两个字段的值,我们需要定义两个变量来接收它,如果是3个,5个,10个或者更多怎么办,那么我们是不是需要定义很多的变量来接收它呢,下面我们来看如何解决这个问题!
2.2 记录类型(record)
record 可以看成为多个单独变量的集合,可以方便我们的查询,INSERT,UPDATE
若创建records,需要先定义一个record类型,再用该类型声明遍。也可以创建或查找一个表,视图,或PL/SQL游标,总之是你想要的值,使用%ROWTYPE属性来创建匹配的record。
你可以在任何PL/SQL块,子程序或包的声明部分定义record类型。当你定义record类型时,不能在域上指定一个NOT NULL的约束,或给出它们的默认值。
实例:
declare
type emp_record is record(
job emp.job%type,--职称
deptno emp.deptno%type --部门编号, 多个用, 隔开
); -- 定义record类型
v_emp_record emp_record; --定义一个record类型的变量
begin
select job,deptno into v_emp_record from emp where empno=7788;
dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno);
end;
2.2.1 record 定义
record定义必须在PL/SQL块中,格式为: type record_name is record( cl1 ,cl2 ,cl2 ...);
2.2.2 record 使用
使用记录类型的变量名.字段名 (可以这样理解)
dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno);
2.2.3 record的常用场景
declare
v_emp_record emp%rowtype; --table_name%rowtype 本身就是一个记录类型,所有可以直接申明这个类型的变量就ok了
begin
select * into v_emp_record from emp where empno=7788;
dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno);
end;
table_name%rowtype 本身就是一个记录类型,所有可以直接申明这个类型的变量就ok了
2.3 %ROWTYPE
上面已经说了 table_name%ROWTYPE 本身就是一个记录类型,这个记录类型包含了table_name这张表中的所有的字段。
并且不需要定义记录类型了,可以直接定义记录类型的变量,也可以说是记录类型的一种简化吧!
declare
v_dept_record dept%rowtype; --定义一个record类型的变量
begin
select * into v_dept_record from dept where deptno=10;
dbms_output.put_line('部门名称:'||v_dept_record.dname||'部门编号:'||v_dept_record.deptno);
end;
下面将对游标单独讲解,未完待续 .......
|
|
|
|
来源:oschina
链接:https://my.oschina.net/u/1775885/blog/309593