一、PL/SQL简介
1、SQL、PL/SQL
结构化查询语言(SQL)是用来访问和操作关系型数据库的一种标准语言,使用SQL可以很方便地调用相应语句来取得结果,特点:非过程化,即不需要关注实现细节,比如我们查询中使用 order by排序,这个排序的过程我们无需关注.
但是,在某些情况下,SQL满足不了复杂的业务需求,而PL/SQL语言可以解决这一问题,PL/SQL语言是oracle公司在标准SQL语言基础上进行扩展而形成的一种可以直接在数据库上进行编程设计的语言,是一种过程化语言,PL/SQL完全可以像Java语言一样实现逻辑判断、条件循环、异常处理等逻辑.
2、PL/SQL特点
1)、支持SQL的所有数据类型,并在此基础上扩展了新的数据类型
2)、支持SQL的函数以及运算符
3)、支持事务控制和SQL数据操作命令
4)、PL/SQL可以存储在Oracle数据库中
5)、Oracle中有自己的DBMS包,可以处理数据的控制和定义命令
3、PL/SQL优势
1)、提高程序运行性能
标准SQL执行时,只能一条一条的向服务器发送,如果一个复杂逻辑需要几十条SQL语句,那么在这个过程中,应用程序会几十次连接数据库,这会浪费大量的资源在网络连接上.
如果使用PL/SQL语句,完全可以将这些SQL语句编写到一个PL/SQL块中,这样只需要连接一次数据库就可以把需要的参数传递过去,其它的将在Oracle内部完成,然后返回结果,大大节省了网络资源.
2)、提供模块化程序设计
比如保存数据时涉及到多张表,完全可以将这些操作放进一个程序块中,对外只需要提供调用方式、需要传入的参数,使用及其方便.
3)、可以使用逻辑控制程序结构
在PL/SQL中,我们可以利用逻辑控制语句完成复杂的功能,这些是普通SQL语句不支持的.
4)、良好的兼容性
PL/SQL在允许运行Oracle的任何平台都支持使用
5)、处理运行错误
使用PL/SQL提供的Exception,开发人员可以集中处理各种Oracle错误以及PL/SQL错误.
二、PL/SQL开发工具
1、SQL*PLUS
SQL*PLUS 是Oracle公司提供的一个工具程序,用于运行SQL语句、PL/SQL块,可以在命令行运行,也可以在windows窗口中运行.
使用前需要先连接上数据库,在命令行中连接命令如下:
sqlplus [username]/[password][@server]
username 是数据库用户名
password 是连接的口令
server 是用来指定主机的字符串
示例:
sqlplus scott/qqqaaa@orcl 以scott身份登陆
sqlplus sys/qqqaaa@orcl as sysdba 以DBA身份登陆
连接上之后就可以进行PL/SQL的开发、测试了
2、iSQL*PLUS
其实就是SQL*PLUS 的网页版
3、PL/SQL Developer
用于开发PL/SQL的集成开发环境(IDE),是一个独立的产品,而不是oracle数据库附带的产品.
4、Procedure Builder
是Oracle应用开发工具Developer提供的一个产品.
三、PL/SQL块的结构
PL/SQL程序的基本单位是块,而每个PL/SQL块很明确的分为3部分,如下:
无论PL/SQL程序块的代码量的多与少,它都由这3部分构成,其中执行部分必须有,其它两者可以没有,下面在SQL*PLUS中举例演示.
先打开sqlplus的输出功能
set serveroutput on
1、只有执行部分
begin
DBMS_OUTPUT.PUT_LINE('Hello World');
end;
/
这个语句块将输出Hello World到屏幕.
2、包含声明部分、执行部分
declare
v_str varchar(20);
begin
v_str := 'Hello World';
DBMS_OUTPUT.PUT_LINE(v_str);
end;
/
这里在声明部分定义了一下变量,在执行部分为其赋值,最后输出该变量的值到屏幕.
PL/SQL中赋值使用的是 :=,注意,冒号与等号之间不能有空格.
3、包含声明部分、执行部分、异常处理部分
declare
v_name varchar(20);
begin
select p.name into v_name from product p where p.pid = '1';
DBMS_OUTPUT.PUT_LINE('商品id为1的商品名称是' || v_name);
exception
when NO_DATA_FOUND THEN --记录不存在
DBMS_OUTPUT.PUT_LINE('商品不存在');
when TOO_MANY_ROWS THEN --记录超过一条
DBMS_OUTPUT.PUT_LINE('商品id为1的商品不止一个');
end;
/
这里使用了PL/SQL中特有赋值语句: select ... into ...,其中select后面是要查询的字段,into后面是变量名称,表示把查询出来的值赋值给变量,使用时需要注意:查询的列名顺序、个数要与变量对应,并且该查询语句每次只能返回一条记录,如果没有返回的记录或者返回记录超过一条,那么都会引发异常.
这两个异常分别是:NO_DATA_FOUND、TOO_MANY_ROWS,都是oracle预定义好的.
四、PL/SQL块的分类
使用PL/SQL开发程序时,根据需要实现的应用模块功能,可以将PL/SQL块划分为四种类型:匿名块、命名块、子程序、触发器.
1、匿名块
指没有名称的PL/SQL块,直接以 DECLARE 开始.
2、命名块
指具有特定名称的PL/SQL块
示例1:
<<outer_pl>>
declare
v_str varchar(10):='测试';
begin
DBMS_OUTPUT.PUT_LINE(v_str);
end;
示例2:
<<outer_pl>>
declare
v_str varchar(10):='测试';
begin
<<inner_pl>>
begin
DBMS_OUTPUT.PUT_LINE('1:' ||v_str);
end;
DBMS_OUTPUT.PUT_LINE('2:' ||v_str);
end;
命名块与匿名块很相似,只不过在PL/SQL块前使用 <<名称>>命名,主要用处是区分PL/SQL块的多层嵌套关系.
3、子程序
子程序包括:过程、函数、包,开发子程序时,既可以开发客户端子程序,也可以开发服务端的子程序,子程序可以简化客户端的开发和维护,并且能提高程序的性能.
4、触发器
指隐含执行的存储过程,它可以使用PL/SQL、JAVA、C进行开发,当发生特定事件时,Oracle会自动执行触发器的相应代码,触发器由触发事件、触发条件(可选)、触发操作3部分组成.
网友评论