全部的编程语言中变量是使用最频繁的。PL/SQL做为一个面向过程的数据库编程语言一样少不了变量,利用变量能够把PL/SQL块须要的参数传递进来,作到动态执行程序,同时也能够利用变量在PL/SQL内部进行值得传递,甚至能够把值传递出去,最终返回给用户,因而可知,变量是PL/SQL不可或缺的一部分。
java
类型 | 子类 | 说明 |
Oracle中的范围 |
char |
Character,Stringsql Rowid,Nchar数据库 |
定长字符串 民族字符集 |
2000(缺省值1) |
varchar2 | varchar,String编程语言 ,Nvarchar2性能 |
可变字符串学习 民族语言字符集优化 |
4000 |
Binary_integer |
带符号整数,为整数计算优化性能 | ||
number(s,p) |
double,integer,int | ||
Long | 变长字符串 | 32767 | |
date | 日期型 | ||
ROWID | 存放数据库行号 | ||
URowid | 通用行标识符,字符串类型 |
Oracle在PL/SQL中除了提供像前面介绍的各类类型外,还提供一种称为复合类型的类型:
spa
记录和表
code
咱们先看下面的例子:
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个或者更多怎么办,那么咱们是否是须要定义不少的变量来接收它呢,下面咱们来看如何解决这个问题!
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;
record定义必须在PL/SQL块中,格式为: type record_name is record( cl1 ,cl2 ,cl2 ...);
使用记录类型的变量名.字段名 (能够这样理解)
dbms_output.put_line('雇员职称:'||v_emp_record.job||'雇员部门编号:'||v_emp_record.deptno);
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了
上面已经说了 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;
下面将对游标单独讲解,未完待续 .......