学习目标:
1、了解PL/SQL
2、了解使用PL/SQL定义变量和基本语句块
3、了解使用PL/SQL的异常
学习过程:
今天我们开始主要学习PL/SQL语言,作为一名java成员人员至少要了解一门数据库编程语言,这里我们就以oracle的PL/SQL语言来学习。这两天的课程也仅仅只是PL/SQL语言的入门,我们不是要把大家培养成为专业的Oracle的DBA,如果大家有兴趣可以自己阅读PL/SQL语言的相关书籍。
一、什么是PL/SQL语言
1、什么是PL/SQL语言
PL/SQL即过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,PL/SQL也是一种程序语言,PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。PL/SQL 只有 Oracle 数据库才有。其他数据库是不支持PL/SQL语言的。
PL/SQL语言是一种应用开发语言,和普通的编程语言,比如java语言,它也支持变量定义,循环,条件分支处理。而且它将SQL的数据操纵功能与过程化语言数据处理功能结合起来。同时支持高级语言的块操作,与数据库核心的数据类型集成,使SQL 的程序设计效率更高。
2、PL/SQL语言的优点
通过多条SQL语句实现功能时,每条语句都需要在客户端和服务端传递,而且每条语句的执行结果也需要在网络中进行交互,占用了大量的网络带宽,消耗了大量网络传递的时间,而在网络中传输的那些结果,往往都是中间结果,而不是我们所关心的。
而使用PL/SQL程序是因为程序代码存储在数据库中,程序的分析和执行完全在数据库内部进行,用户所需要做的就是在客户端发出调用PL/SQL的执行命令,数据库接收到执行命令后,在数据库内部完成整个PL/SQL程序的执行,并将最终的执行结果返馈给用户。
二、PL/SQL块简介
PL/SQL 块是构成 PL/SQL 程序的基本单元,将逻辑上相关的声明和语句组合在一起。PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分,定义参考格式如下:
[DECLARE
declarations]
BEGIN
executable statements
[EXCEPTION
handlers]
END;
三、变量和常量
PL/SQL 块中可以使用变量和常量,在声明部分声明,使用前必须先声明,声明时必须指定数据类型,每行声明一个标识符,在可执行部分的 SQL语句和过程语句中使用,声明变量和常量的语法:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
给变量赋值有两种方法:
使用赋值语句 :=
使用 SELECT INTO 语句。
示例:
declare --声明变量
wid int:=100;
hei number(7,2):=12.3;
pass varchar2(100);
username varchar2(100);--获得用户输入
begin
end;
用于引用数据库列的数据类型,以及表示表中一行的记录类型 l属性类型有两种:
- %TYPE - 引用变量和数据库列的数据类型。
- %ROWTYPE - 提供表示表中一行的记录类型。
使用属性类型的优点:不需要知道被引用的表列的具体类型,如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变。
示例:
--由用户输入商品的id,打印出商品的名称 商品价格
declare
gname GOODS.GOODS_NAME%TYPE;--参考表的属性的类型
gcash GOODS.CASH%TYPE;
gid GOODS.GOODS_ID%TYPE ;
begin
gid:=&gd;
select GOODS_NAME,CASH into gname,gcash from GOODS where GOODS_ID=gid;
dbms_output.put_line(gname||':'||gcash);
end;
四、异常模块
在运行程序时出现的错误叫做异常,发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分,异常有两种类型:
- 预定义异常 - 当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发。
- 用户定义异常 - 用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发。
示例:
declare --声明变量
wid int:=100;
hei number(7,2):=12.3;
pass varchar2(100);
username varchar2(100);--获得用户输入
begin
dbms_output.put_line(username);
pass:='abc';
dbms_output.put_line(pass);
dbms_output.put_line('area:'||(wid*hei));--字符串的链接
exception
when others then
dbms_output.put_line('error');
end;