接触 PL/SQL 第二天

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;

4) VARRAY(变长数组)
创建类型
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类型就有种全局变量的感觉了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值