一、了解 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;

posted on 2018-12-10 17:55  独自的独行  阅读(223)  评论(0)    收藏  举报