首先,我们知道什么是SQL, 那PL/SQL就不难理解,可以理解成在sql的基础上加上控制语句。
一、PL/SQL概念
PL/SQL 是过程语言与结构化查询语言结合而成的编程语言。
- pl/sql是对sql的扩展,给sql语句增加了程序逻辑(跳转、循环……)
- 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
- 与oracle紧密集成,具备可移植性/灵活性/安全性
二、优点
①支持 SQL,在 PL/SQL 中可以使用:
- 数据操纵命令
- 事务控制命令
- 游标控制
- SQL 函数和 SQL 运算符
②用户把PL/SQL块整个发送到服务器端,oracle服务器端编译、运行,再把结果返回给用户。(节省网络流量)
③可移植性,可运行在任何操作系统和平台上的Oralce 数据库
④安全性,可以通过存储过程限制用户对数据的访问。
⑤与 SQL 紧密集成,简化数据处理。
- 支持所有 SQL 数据类型
支持 NULL 值
支持 %TYPE 和 %ROWTYPE 属性类型
三、体系结构
用户将PL/SQL块发送给oracle服务器,在服务器端有两类引擎,PL/SQL引擎用来执行过程语句,SQL引擎用来执行sql语句。
for i in 1..100 loop --PL/SQL引擎
insert into students values(1,'lily',18); --SQL引擎
end loop; --PL/SQL引擎
四、PL/SQL程序块
plsql程序块可以分为三大部分,声明部分,可执行部分 ,异常处理部分
[declare
declarations]
begin
executable statements
[Exception
handlers]
END;
声明变量与常量:
变量和常量在声明部分声明,使用前必须先声明,声明时指定数据类型,每行声明一个标识符,在可执行部分的SQL语句和过程语句中使用。
identifier [constant] datatype [not null] [ := default expr]
identifier 变量名
[constant] 写上表示该声明的为一个常量
datatype 数据类型
[not null] 表示非空
[ := default expr] := 为赋值符号,为变量or常量赋初值
区别
在PL/SQL中:
赋值: a :=3
从表中取信息赋值给一个变量: select count(*) into a from student;
在T/SQL中:
赋值: set @a=3 或 select @a=3
从表中取信息赋值给一个变量: select @a=count(*) from student;
五、举例
如下有一张表:
写一个PLSQL程序块用来表示上表student的总记录数,并打印出来。
set serverout on -- 打开执行开关
declare
total_row number;
begin
select count(*) into total_row from student;
dbms_output.put_line('一共有'||total_row||'条记录');
end;
/ -- 执行
六、plsql支持的数据类型
如下图:
1.1标量类型:—数字类型
binary_integer:有符号整数,即就是可正可负
pls_integer:在进行复杂的运算时,使得运算速度更快。
oracle 11g中新增了一个类型为:
simple_integer(-2147483648~+2147483647),要求 数据类型不为空,该类型运算速度很快,提高运算性能。(底层在物里设置做了优化操作)
1.2标量类型:—字符类型 (表述范围增大)
在sql中声明了一个char类型的列,将其放入plsql中完全绰绰有余,反之,plsql类型的列放入sql类型,可能会出现问题。
1.3标量类型:—日期时间类型
date timestamp 两种类型
1.4标量类型:—布尔数据类型
boolean (true false null)
此类别只有一种类型,即BOOLEAN类型
用于存储逻辑值(TRUE、FALSE和NULL)
不能向数据库中插入BOOLEAN数据
不能将列值保存到BOOLEAN变量中
只能对BOOLEAN变量执行逻辑操作
lob类型 (仅存储定位符,指向大型对象的存储位置)
用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据。
LOB 数据类型可存储最大 4GB的数据。
LOB 类型包括:
BLOB 将大型二进制对象存储在数据库中
CLOB 将大型字符数据存储在数据库中
NCLOB 存储大型UNICODE字符数据
BFILE 将大型二进制对象存储在操作系统文件中
blob举例:(大型二进制对象,如图片)
在c盘根目录下建立一个文件夹命名为photo,并在里面放入一张图片;oracle为了符合操作系统的文件结构,也需要建立目录:
--system用户下,创建一个目录,赋予相关用户读写该目录的权限
create directory PHOTO as'c:\photo';
grant read,write on directory PHOTO to scott;
--建表,在表中存放图片于blob类型的列中
create table person(pid varchar2(20) primary key,photo blob);
--创建存储过程(用来读取操作系统中的图片)
create or replace procedure insertBlob (id varchar2 ,imgFile varchar2)
is
img_file bfile;
img_blob blob;
lob_length number;
begin
--先插入一个空值在person表中
insert into person values(id,empty_blob())
--查询person表中刚才插入的空值行,并将blob类型列赋给存储过程中的变量;
select photo into img_blob from person where pid=id;
--读取img_file中的内容,为photo目录下的imgFile文件。
img_file=('PHOTO',imgFile);
--打开图片
dbms_lob.open(img_file);
--加载图片 把img_file加载到img_blob中,加载img_blob长度。
dbms_lob.loadfromfile(img_blob,img_file,img_blob);
--关闭图片
dbms_lob.close(img_file);
--提交
commit;
end;
/
--执行该存储过程,需要插入数据(in类型),图片已经被保存为二进制代码。
exec insertBlob('1','aa.jpg') --假设文件名为aa
clob举例:
create table c_test(no number primary key,c_info clob );
insert into c_test values(1,'林俊杰是一位十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分十分著名的华语男歌手');
--单单使用sql来取该行数据的话,只能显示一部分,下面使用PL/SQL来实现对该行的操作。
如何使用 DBMS_LOB程序包来操纵lob类型
SET SERVEROUTPUT ON
DECLARE
clob_var CLOB;
amount INTEGER;
offset INTEGER;
output_var VARCHAR2(1000);
BEGIN
SELECT c_info INTO clob_var
FROM c_test
WHERE no=1;
amount := 1000; -- 要读取的字符数
offset := 1; -- 起始位置
DBMS_LOB.READ(clob_var,amount,offset,output_var);
--DBMS_LOB程序包下的read过程来读取数据
DBMS_OUTPUT.PUT_LINE(output_var);
属性类型
用于引用数据库列的数据类型,以及表示表中一行的记录类型
属性类型有两种:
- %TYPE - 引用变量和数据库列的数据类型
- %ROWTYPE 提供表示表中一行的记录类型
使用属性类型的优点:
不需要知道被引用的表列的具体类型
如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变,健壮性