您的位置:首页 > 数据库

接触 PL/SQL 第二天

2017-04-04 10:04 267 查看

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
4000
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类型就有种全局变量的感觉了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: