PL/SQL 中的变量
PL/SQL中变量可以分为四种
1.标量类型
2.复合类型
3.参照类型
4.LOB类型
我画个图
这个图是照书上抄的.
下面来说说四种变量
1.标量变量
只能存放单个数值的变量, 它包括数字类型,字符类型,日期类型和布尔类型,分别对应上图的四个小框框. 标量是最常用的类型
1)常用的有:
number(p,s) 数字类型,p表示总共位数,s表示小数点位数 比如 sal number(6,2) 那么sal的取值范围就是 0.01~9999.99
char(n) 定长字符串类型,就是固定长度的字符串, 比如 name char(50) ,那么name的长度就是固定50个字符,长度不够用空格补齐, n要小于2000
varchar2(n) 变长字符串类型,就是长度自适应, 比如 name varchar(50) , 那么 name的长度根据name的实际长度取值,最大50个字符 n要小于4000
date 日期类型,长度固定7字节. 注意: 当给date变量赋值时,数据必须与日期格式和日期语言匹配
timestamp 也是日期类型, 定义更为精准的时间. 注意事项与date类型一致
long 变长字符串,类似于 varchar2类型 最大长度可为 32760
long row 变长的二进制数据, 最大长度为 32760
boolean 布尔值变量, 值可为 true,false,null 该类型只能在PL/SQL中使用
binary_integer 定义整数, 取值范围 -2147483647~2147483647, oracle9之前下标必须使用该类型, 只能用于PL/SQL中
binary_float / binary_double oracle 10g新增的数据类型, 分别用于定义单/双精度浮点型 , 主要用于高速的科学计算. 注意: 定义时要加后缀 比如: 1.5f , 3.006d
2)定义标量变量
identifier 定义变量或常量的名称
CONSTANT 指定常量, 记得给常量赋值
datatype 指定变量或常量的数据类型
not null 指定不能为空值
default 指定默认的初始值
expr 指定初始值的PL/SQL表达式 , 可以是文本值,其他变量,函数等
如:
v_ename varchar2(20);
v_sal number(6,2);
v_bal binary_float;
v_rate CONSTANT number(4,2) :=21.23; -- 常量
v_hiredate date;
v_valid boolean not null default false; -- 非空,默认为false的布尔类型
3)使用
下面来写个例子
declare
v_ename varchar2(20);
v_sal number(6,2);
v_tax_rate CONSTANT number(3,2) :=0.03; --所得税系数
v_tax_sal number(6,2); --所得税
begin
select ename,sal into v_ename,v_sal from emps where empno=&no;
v_tax_sal := v_sal*v_tax_rate;
dbms_output.put_line('姓名:'||v_ename);
dbms_output.put_line('薪资:'||v_sal);
dbms_output.put_line('所得税:'||v_tax_sal);
end;
4) %type
根据类型的实际情况来设定长度,后面厉害会演示
2.复合变量
变量可以记录多个信息
写例子比较直观
1)记录
declare
type emps_record_type is record(
v_ename emps.ename%type,
v_sal emps.sal%type,
v_job emps.job%type
);
emps_record emps_record_type;
begin
select ename,sal,job into v_ename,v_sal,v_job from emps where empno=&no;
dbms_output.put_line('姓名:'||emps_record.v_ename);
end;
2)表
declare
type ename_table_type is table of emps.ename%type
index by BINARY_INTEGER;
ename_table ename_table_type;
begin
select ename into ename_table(1) from emps where empno=&no;
dbms_output.put_line('姓名:'||ename_table(1));
end;
3)嵌套表
create or replace type emps_type as OBJECT(
v_ename varchar2(20),
v_sal number(6,2),
v_job varchar2(20)
);
create or replace type emps_array is table of emps_type;
create table department(
deptno number(2),
dname varchar(10),
employee emps_array --上面定义的表类型
) nested table employee store as employee;
创建类型
create type article_type as OBJECT(
title varchar2(30),
pubdate date
);
create type article_array is varray(20) of article_type;
引用该类型
create table author(
id number(5),
name varchar2(20),
article article_array
);
3.参照变量
1)游标
declare
type c1 is ref cursor;
emps_cursor c1;
v_ename emps.ename%type;
v_sal emps.sal%type;
begin
open emps_cursor for
select ename,sal from emps where deptno=&no;
loop
fetch emps_cursor into v_ename,v_sal;
exit when emps_cursor%NOTFOUND;
dbms_output.put_line(v_ename);
end loop;
close emps_cursor;
end;
2) ref obj_type 共享数据
create or replace type home_type as OBJECT(
street varchar2(50),
city varchar(20),
state varchar(20),
owner varchar(20)
);
create table homes of home_type; -- 创建表
insert into homes values('五一路128号','福州','350001','张一');
insert into homes values('五四路328号','福州','350002','李一');
insert into homes values('六一路165号','福州','350003','王一');
commit;
共享
create table person(
id number(5) primary key,
name varchar2(20),
addr ref home_type
);
insert into person select 1,'张三',ref(p) from homes p where p.owner='张一';
insert into person select 2,'张五',ref(p) from homes p where p.owner='张一';
insert into person select 3,'张六',ref(p) from homes p where p.owner='张一';
4.LOB变量 用于存储大批量数据的变量
分为内LOB和外LOB
1)内LOB
内LOB又包括 BLOB, CLOB, NCLOB 三种类型 支持事务操作.
其中CLOB/NCLOB用于存储大批量字符数据
BLOB用于存储大批量二进制数据
2)外LOB
外LOB 有 BFILE一种类型 不支持事务操作
BFILE 用于存储指向OS文件的指针
---书上并没有详细介绍LOB类型,对该类型理解比较模糊---
补充:非PL/SQL变量
1) SQL*Plus 变量
var name varchar(20)
begin
select ename into :name from emps where empno=&no;
end;
2) Procedure Builder 变量
.create char name length 20
begin
select ename into :name from emps where empno=&no;
end;
TEXT_IO.PUT_LINE(:name);
scott
3) Pro*C/C++ 变量
char name(10);
exec sql execute
begin
select ename into :name from emps where empno=&no;
end;
end-exec;
print(name);
总结:感觉PL/SQL中的变量跟高级语言的变量类似,四大类型中 标量类似于java中的基础类型,包括String,复合类型类似于引用类型,参照类型感觉像继承,有数据共享的意思
LOB类型只提到存储大量数据,没有给出具体的用法,不予评价. 另外非PL/SQL类型就有种全局变量的感觉了