一、了解 PL/SQL 中支持的内置数据类型及其使用方法
1,数据类型:标量类型,LOB类型,属性类型
1-1,标量类型:数字,字符,布尔型,日期
1-1-1,数字类型 BINARY_INTEGER:存储有符号整数,所需存储空间少于 NUMBER 类型值,包含子类型:NATURAL,NATURALLN,POSITIVE,POSITIVER,SIGNTYPE
1-1-2,数字类型 NUMBER:存储整数、实数、浮点数,包含子类型:DECIMAL、FLOAT、INTEGER、REAL
1-1-3,数字类型 PLS_INTEGER:存储有符号整数,可使算术计算快速而有效(天文,物理数据量大的时候比较有用)
1-1-4,数字类型 SIMPLE_INTEGER:Oracle 可以将这个数据类型的操作直接作用于硬件,从而提高性能,取值为 -2147483648~+2147483647,另外这个数据类型不能为空
1-2-1,字符数据类型包括:CHAR,VARCHAR2,LONG,RAW,LONG RAW
1-2-1,PL/SQL 的数据类型与 SQL 数据类型的比较;如下图:

1-3,布尔类型其值只能是:true、false、null;
1-3-1,逻辑比较用于比较变量和常量的值,这些表达式称为布尔表达式,布尔表达式由关系运算符与变量或常量组成,布尔表达式的结果为 TRUE、FALSE、NULL,通常由逻辑运算符 AND、OR、NOT 连接;
1-3-2,布尔表达式有三种类型:数字布尔型,字符布尔型,日期布尔型
2,LOB 类型(存储非结构化数据块):BFILE,BLOB,CLOB,NCLOB;用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据,可存储最大 4GB 的数据
2-1,BLOB 将大型二进制对象存储在数据库中;例:将 ‘C:\PHOTO' 下的 aa.jap 图片放入到 person 表中的列
create table person(pid number primary key, photo blob); --创建 person 表
create directory PHOTO as 'c:\photo'; --在 system 用户下创建逻辑目录,指向硬盘中的位置
grant read, write no directory PHOTO to scott; --将此目录的操作权限赋给 scott 用户
create or replace procedure insertBlob(id varchar2, imgFile varchar2) --创建一个存储过程,可以反复被执行
is --开始声明变量
img_file bfile;
img_blob blob;
lob_length number;
begin --程序入口
insert into person values(id, empty_blob()); --先插入一个空值
select photo into img_blob from person where pid = id;
img_file := bfilename('PHOTO', imgFile); --读取 img_file 中的内容
dbms_lob.open(img_file); --打开得到的文件
lob_length := dbms_lob.getlength(img_file); --得到所打开的文件的字节长度
dbms_lob.loadfromfile(img_blob, img_file, lob_length);
dbms_lob.close(img_file);
commit;
end:
/
说明:使用此存储过程 exec insertBlob('1', 'aa.jpg'); 表示将 ’c:\photo' 目录下的 ‘aa.jpg' 插入到 person 表中
2-2,CLOB 将大型字符数据存储在数据库中;
2-3,NCLOB 存储大型 UNICODE 字符数据;
2-4,BFILE 将大型二进制对象存储在操作系统文件中;
2-5,LOB 类型的数据库列仅存储定位符,该定位符指向大型对象的存储位置;DBMS_LOB 程序包用于操纵 LOB 数据;例:
3,属性类型:%TYPE(提供某个变量或数据库表列的数据类型),%ROWTYPE(提供表示表中一行的记录类型);
3-1,使用属性类型的优点:1,不需要知道被引用的表列的具体类型;2,如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变,健壮性
4,在 PL/SQL 中取出序列的 nextval 、currval 时,可以不使用 select 语句,可以类似如下:
declare
aa number;
begin
aa := seq1.nextval;
dbms_output.put_line('aa的值是:’ || aa);
end;
二、控制结构
1,PL/SQL 支持的流程控制结构:
1-1,条件控制:IF 语句、CASE 语句
1-1-1,IF 语句根据条件执行一系列语句,有三种形式:IF-THEN、IF-THEN-ELSE、IF-THEN-ELSIF;例:
create table student(sid number,sname varchar2(20), birthday date); --创建一个学生类
declare
sbirth1 student.birthday%type; --表示将 student 表的 birthday 列的类型赋给变量 sbirth1;
begin
select birthday into sbirth1 from student where sid=1; --将学生表中 sid=1 的学生的生日取出来赋值给变量
if sbirth1 < to_date('19850101', 'yyyymmdd') then --判断变量的时间是否小于指定的日期
dbms_output.put_line('大于25岁'); --如果小于则输出“大于25岁”
else
dbms_output.put_line('小于等于25岁');
end if;
if sbirth1 >= to_date('19850101', 'yyyymmdd') then --判断变量的时间是否大于等于指定的日期
dbms_output.put_line('小于等于25岁'); --如果大于则输出“小于等于25岁”
end if;
end;
1-1-2,case 语句的用法,如下图

1-2,循环控制:LOOP 循环(无条件循环)、WHILE 循环(根据条件循环)、FOR 循环(循环固定的次数)
1-2-1,LOOP 循环使用;例:
set serverout on --开启打印
declare
j number:=0;
begin
j := 1;
loop
dbms_output.put_line(j || '---');
exit when j>7;
j := j+1;
end loop;
dbms_output.put_line('结束');
end;
1-2-2,while 循环的使用,例:
declare
j number:=0;
begin
j := 1;
while j<=8
loop
dbms_output.put_line(j || '---');
j := j+1;
end loop;
dbms_output.put_line('结束');
end;
1-2-3,for 循环的使用,例:
declare
j number:=0;
begin
for j in 1..8 loop --表示 j 每次加1 循环 8 次
dbms_output.put_line(j || '---');
exit then j>4; --可以不要,写上表示当 j 的值大于4的时候退出循环
end loop;
dbms_output.put_line('结束');
end;
1-3,顺序控制:GOTO 语句、NULL 语句;例:
declare
j number:=0;
begin
j := 1;
<<aa>> --设置标签
dbms_output.put_line(j || '---');
j := j+1;
if j<=7 then goto aa; end if; --表示如果 j 的值是小于等于7时,回到标签 aa 处继续开始执行
if j>7 then goto bb; end if; --表示如果 j 的值是大于7时,回到标签 bb 处继续执行
<<bb>> null; --标签 bb 啥也不用做
dbms_output.put_line('结束');
end;
1-3-1,GOTO 语句-无条件地转到标签指定的语句
1-3-2,NULL 语句-什么也不做的空语句
2,continue 语句:11g新增加的语句,可在循环中使用,该语句可将逻辑移到循环结尾,然后再移到循环开头,例:
declare
j number:=1;
begin
loop
j:j+1;
exit wher j>8;
continue when j>4;
dbms_out.put_line(to_char(j) || '---');
end loop;
end;
浙公网安备 33010602011771号