什么是PL/SQL
许多时候我们会利用结构化查询语言(SQL)来访问和操作关系型数据库。这种语言的特点就是非过程化。也就是说使用的时候不用指明执行的具体方法和途径,即不用关注任何的实现细节。但这种语言也有一个问题,就是在某些情况下满足不了复杂业务流程的需求。
所以就出现了PL/SQL,Oracle的PL/SQL语言正是完美的解决了这个问题,也就是过程化语言。和JAVA、C#等语言一样可以关注细节,用它可以实现复杂的业务逻辑。
PL/SQL的优点
使用PL/SQL可以编写具有很多高级功能的程序,虽然这些功能可以通过多个SQL语句来完成同样的功能,但是PL/SQL具有以下优点:
- 使一组语句功能形成模块化程序开发
- 使用过程性语言控制程序结构
- 可以对程序中的错误进行处理
- 具有较好的可移植性
- 集成在数据中,调用更快
- 减少了网络的交互,有助于提高程序的性能
PL/SQL提供的新特性
PL/SQL提供了一些新的特性,可以进行复杂的信息处理
- 软件包
- 触发器
- 存储过程
- 函数
- 异常处理
PL/SQL可以使用所有的SQL数据操作,游标控制和事务控制命令,以及所有的SQL函数和运算符。PL/SQL完全支持SQL数据类型
PL/SQL块的基本结构
PL/SQL中起作用的部分都是由基本块组成的:基本块有四个
组成部分:
--声明部分:
DECLARE -- 可选部分
-- 变量、常量、游标、用户定义异常声明
-- 执行体开始部分
BEGIN -- 必要部分
-- SQL语句
-- PL/SQL语句
-- 异常处理部分
EXCEPTION -- 可选部分
-- 程序出现异常时,捕捉异常并处理异常
-- 执行体结束
END; -- 必要部分(结尾)
在PL/SQL中处理变量
- 在声明部分声明和初始化变量
- 在执行部分为变量赋新值,或在表达中使用变量
- 在异常处理部分也可以使用变量
- 通过参数把值传递到PL/SQL块中
- 通过输出变量或者参数将值传出PL/SQL块
DECLARE
-- 在declare部分声明变量,常量等
-- 声明 变量的规范: 变量名称 变量类型 [:=缺省值];
v_deptno number;
BEGIN
-- 在 begin部分可以写 SQL语句,PL/SQL语句
-- 在 begin部分中可以使用declare部分声明的变量,常量
dbms_output.put_line('欢迎使用PL/SQL,执行查询语句之前,v_deptno=' || v_deptno);
-- dbms_output.put_line();是输出语句,单引号包起来的将原封不动的给我们,|| 是拼接符
select deptno into v_deptno from emp where empno = 7369;-- PL/SQL语句
-- 把查询语句查询的结果赋值给v_deptno这个变量
dbms_output.put_line('执行查询语句之后,v_deptno=' || v_deptno);
delete from emp where deptno = v_daptno;
delete from emp where deptno = v_daptno;
END;
在PL/SQL中处理变量
record类型
declare
-- 声明记录类型
type aaa is record(
empno number(4),
ename varchar2(50),
sal number(4)
); -- 这TM不就跟我们创建表一样吗?只是不写约束
--使用记录类型来声明变量
aaa_info aaa; -- aaa_info 是我取得变量名,aaa是我上面声明的记录类型。
begin
-- 给记录类型的变量赋值,只有类型中声明好的字段,才可以访问该字段
select empno,ename,sal into aaa_info from emp where empno=7
aaa_info.empno:=10;
aaa_info.ename:='张三';
aaa_info.sal:=8000;
end;
/*
recode类型是由多个组件组成的一种类型,包含一个或多个组件,
每一个组件称为一个域(fiele),域的数据类型可以是简单变量类型或是table类型。
在使用record变量时把多个域的集合作为一个逻辑单元使用,对记录类型变量(%type)赋值或
引用,都需要使用‘记录变量.域名’的方式来实现。主要用于从表中取出查询到的行数据。
记录类型可以包含一个或多个域,每个域相当于记录类型变量的一个属性。
在使用记录变量类型时,实际上是对记录类型变量的属性进行操作。每个域
都可以是不同的数据类型,存放不同类型的数据。
*/
%type和%rowtype
/*
除了可以使用已经确定的类型来声明变量,还可以使用%type和%rowtype来作为变量的类型。
当使用%type来声明变量的时候,%type的前缀可以是一个前面已经声明的简单类型的量,
也可以是一个表的字段名称。
*/
declare
a number(4); -- 这tm就是简单变量
b a%type; -- %type 也tm可以这么用
begin
end;
-- 还能特么这么用
declare
a emp.empno%type; -- a为我的变量名,emp是我的表名,emp.empno是我表中的字段。后面加个%type,意思就是用emp表中empno这个字段的数据类型作为变量名a的数据类型。
begin
end;
/*
%rowtype 前缀可以是一个表名,也可以是前面声明的一个记录类型的变量(该变量必须参照一个表,而不是自定义的记录类型)
*/
declare
--e是我取的变量名,emp是我的表 row是行,type是类型。那rowtype就是所有行的类型
-- 那这里的emp%rowtype 就是表示 e可以用emp表里行数据中的所有字段
e emp%rowtype;
-- 在使用%rowtype的时候,Oracle做了两件事:
-- 1.用emp表中的字段及其类型来声明了一种记录类型
-- 2.用这种记录来声明变量
begin
select * into e from emp where empno=7499;
dbms_output.put_line(e.ename||e.sal);
end;
更多推荐
PL/SQL基础:结构、变量处理——PL/SQL教程(一)
发布评论