PLSQL程序设计
第2讲 PLSQL程序设计

15.3 控制结构 选择结构 循环结构 跳转结构
38
15.3.1选择结构
IF语句
IF condition1 THEN statements1; [ELSIF condition2 THEN statements2;] …… [ELSE else_statements]; END IF; 注意 条件是一个布尔型变量或表达式,取值只能
数字类型 字符类型 日期/区间类型 行标识类型 布尔类型 原始类型 LOB类型 记录类型 集合类型
20
PL/SQL中常用的基本数据类型
分类
数字类型
字符类型
日期/区间类型 行标识类型
数据类型
NUMBER、BINARY_NUMBER PLS_NUMBER VARCHAR2、CHAR、LONG、
字符串比较
填充比较:通过在短字符串后添加空格,使两个字符串达到相 同长度,然后根据每个字符的ASCII码进行比较。
非填充比较:根据每个字符的ASCII码进行比较,最先结束的 字符串为小。
PL/SQL中规定,对定长的字符串(CHAR类型的字 符串和字符串常量)采用填充比较;如果比较的字符 串中有一个是变长字符串(VARCHAR2类型的字符 串),则采用非填充比较。
如果PL/SQL块相互嵌套,则在内部块中声明的变 量是局部的,只能在内部块中引用,而在外部块 中声明的变量是全局的,既可以在外部块中引用, 也可以在内部块中引用。
如果内部块与外部块中定义了同名变量,则在内 部块中引用外部块的全局变量时需要使用外部块 名进行标识。
27
<<OUTER>> DECLARE v_ename CHAR(15); v_outer NUMBER(5); BEGIN v_outer :=10; DECLARE v_ename CHAR(20); v_inner DATE; BEGIN v_inner:=sysdate; v_ename:='INNER V_ENAME'; OUTER.v_ename:='OUTER V_ENAME'; END; DBMS_OUTPUT.PUT_LINE(v_ename); END;
PLSQL程序设计

包括数值型(如NUMBER)、字符型(如VARCHAR2)、 日期型(如DATE)等。
01
集合数据类型
包括表、数组和集合,用于存储多个值。
02
03
自定义数据类型
使用COMMIT语句可以提交事务,将所有未提交的更改永久保存到数据库中。
感谢您的观看
THANKS
循环读取
使用循环结构(如WHILE循环)逐行读取游标中的数据。
异常处理
在读取游标数据时,应处理可能出现的异常,以确保程序的健壮 性。
游标的关闭
关闭游标
使用CLOSE语句关闭游标,释放与 游标相关的资源。
清理资源
关闭游标后,应释放所有与游标相关 的变量和资源,以避免内存泄漏。
06
PL/SQL事务处理
BEFORE触发器
在指定的事件(如INSERT、UPDATE或DELETE)之前执行的操作。
AFTER触发器
在指定的事件之后执行的操作。
INSTEAD OF触发器
用于视图,当对视图进行修改操作时,触发器中的操作替代了原本 的修改操作。
触发器的应用场景
数据完整性维护
触发器可用于确保数据的完整性,例如, 在更新员工工资时自动计算并更新员工
的总收入。
条件约束
触发器可用于实现复杂的业务规则, 例如,限制某些用户不能删除其他用
户的记录。
自动日志记录
触发器可以在数据修改时自动记录操 作日志,便于跟踪数据变更历史。
数据转换
触发器可以在数据修改时自动进行数 据转换或格式化,例如,将日期字段 自动转换为特定的格式。
05
PLSQL程序设计

5
Oracle10g 数据库基础教程
参数说明
参数的模式
IN(默认参数模式)表示当过程被调用时,实参值被传递给形 参;在过程内,形参起常量作用,只能读该参数,而不能修改 该参数;当子程序调用结束返回调用环境时,实参没有被改变。 IN模式参数可以是常量或表达式。 OUT表示当过程被调用时,实参值被忽略;在过程内,形参起 未初始化的PL/SQL变量的作用,初始值为NULL,可以进行 读/写操作;当子程序调用结束后返回调用环境时,形参值被 赋给实参。OUT模式参数只能是变量,不能是常量或表达式。 IN OUT表示当过程被调用时,实参值被传递给形参;在过程 内,形参起已初始化的PL/SQL变量的作用,可读可写;当子 程序调用结束返回调用环境时,形参值被赋给实参。IN OUT 模式参数只能是变量,不能是常量或表达式。 6
10
Oracle10g 数据库基础教程
(2)存储过程的调用
PL SQL 程序设计

使用 SELECT INTO 进行赋值
还可以按如下方法使用 SELECT INTO 对变量赋值
SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件>;
示例
SELECT first_fare INTO oldfare FROM fare WHERE route_code = ‘SAN-LOU’;
PL/SQL中的逻辑操作符
operator AND operation 两个条件都必须满足
OR
NOT
只要满足两个条件中的一个
取反
注释的使用
添加注释可以提高程序的可读性并帮助
理解
PL/SQL 支持两种注释样式
–
单行注释
可以在行中的任何地方以双分号 (--) 开始 可以扩展到行尾
–
多行注释
PL/SQL 结构
一个标准 PL/SQL 代码段称作程序块 一个程序块是由三个部分或节构成的
–
声明部分
可执行部分
–
–
异常处理部分
PL/SQL 结构
DECLARE 声明 BEGIN 可执行语句 EXCEPTION 例外处理程序 END; PL/SQL 程序块的一部分
PL/SQL 结构
声明部分
操作符
与其他程序设计语言相同,PL/SQL有一系列操 作符。操作符分为下面几类: 1)算术操作符 2)关系操作符 3)比较操作符 4)逻辑操作符
PL/SQL中的算术操作符如下表
operator operation 加 减 除 乘
+ / *
**
乘方
PL/SQL中的关系操作符
PLSQL编程语言的使用与程序设计

实验五 PL/SQL编程语言的使用与程序设计【开发语言及实现平台或实验环境】Oracle10g【实验目的】(1)了解PL/SQL在Oracle中的基本概念;(2)掌握PL/SQL的各组成部分;(3)PL/SQL的运用。
【实验原理】1.PL/SQL字符集和所有其他程序设计语言一样,PL/SQL也有一字符集。
读者能从键盘上输入的字符集是PL/SQL的字符。
此外,在某些场合,还有使用某些字符的规定。
我们将要详细介绍:● 用PL/SQL编程时可能使用的字符● 算术运算符● 关系运算符● 杂符号1)合法字符用PL/SQL程序时,允许使用下列字符:● 所有大、小写字母● 数字0到9● 符号:()+-*/〈〉=!~;:.‘@ %,“# $ ^ & _ | { } ? [ ]2)算术运算符下面列出了PL/SQL中常用的算术运算符。
如果读者使用过其他高级程序设计语言,想必不会陌生:表6 算术运算符运算符意义+ 加法- 减法* 乘法/ 除法** 幂关系运算符下面列出了PL/SQL中常用的关系运算符。
如果读者有使用其他程序设计语言的经验,一定见过这些符号:表7 关系运算符运算符意义<> 不等于!= 不等于^= 不等于< 小于> 大于= 等于3)杂符号PL/SQL为支持编程,还使用下述符号。
下面列出了部分符号,它们是最常用的,也是使用PL/SQL的所有读者都必须了解的。
表8 杂符号4)变量变量是PL/SQL中用来处理数据项所用的名字。
读者根据下列规则选择变量名称:● 变量必须以字母(A~Z)开头。
● 其后跟可选的一个或多个字母,数字(0~9)或特殊字符$、# 或_。
● 变量长度不超过30个字符。
● 变量名中不能有空格。
5)保留字保留字可视为PL/SQL版权所有的字符串。
在定义变量名时,读者不能使用这些保留字。
例如,词“loop”在PL/SQL中有特殊含义,因此下列代码是非法的:declareemployee varchar2(30);loop number;保留字不能用作变量名。
Les12_PLSQL程序设计

when others then 具体处理
Oracle的异常处理
系统定义例外
No_data_found Too_many_rows Zero_Divide Value_error (没有找到数据) (select …into语句匹配多个行) ( 被零除) (算术或转换错误) (在等待资源时发生超时)
Timeout_on_resource
用户定义的例外
演示:系统定义例外(被0除 Zero_Divide)
用户定义例外及处理例外
在declare节中定义例外
out_of exception ;
在可行语句中引起例外
raise out_of ;
在Exception节处理例外
when Out_of then …
赋值语句
var1:='this is a argument'; emp_rec.sal: = sal *2 + nvl(comm, 0); sum_sal:=sum_sal+v_sal; FETCH c1 INTO e_eno , e_sal ;
COMMIT语句
结束当前事务, 使当前事务所执行的全部修改永久化。
3. IF 条件 THEN 语句;
ELSIF 语句 THEN 语句; ELSE 语句;
END IF;
IF语句示例:
判断用户输入的数字,打印相关信息
按1:查询套餐流量,2:查询话费信息,其他:人工客服
提示:
从键盘输入: accept num prompt '请输入一个数字'; 得到键盘输入的值: pnum number := #
第13章 PLSQL程序设计

内容提要
pl/sql 过程化的语言进行程序设计的基础 知识。
13.1 PL/SQL 基础知识
PL/SQL是过程化语言/sql的缩写,是 Oracle在SQL的基础上扩展开发的一种数 据库编程语言,在兼容标准SQL的基础上, 扩充了许多新的功能,是面向过程化的 语言与SQL语言的结合,特点如下:
(1) PL/SQL除了基本的SQL语句之外,还 包括了控制结构和异常处理,从而具有 SQL语言的简洁性和过程化的灵活性。 (2) 每个SQL语句的处理请求都将引起一 次网络传输,容易导致网络拥塞。而 PL/SQL是以整个语句块发给服务器的, 从而减少了网络通信流量,提高了应用 程序的执行速度。
(5) PL/SQL 是一种块结构语言,即构成 一个PL/SQL程序的基本单位是块。
13.1.1 PL/SQL块
1.基本结构 PL/SQL程序的基本单位是块,块分匿名 块、命名块两种。匿名块指未命名的块, 只能执行一次,不能存储在数据库中。 命名块指过程、函数、触发器和包等数 据库对象,它们存储在数据库中,可以 被多次调用执行。
匿名块的基本结构: [DECLARE] BEGIN [EXCEPTION] END;
以被命名和存储在Oracle 服务器中,同时也能被其他的PL/SQL程 序或SQL语句调用,任何客户、服务器工 具都能访问PL/SQL程序,具有很好的可 重用性。
(4)通过授予用户执行PL/SQL块的权限, 而不是直接授予用户对数据库对象的操 作权限,提供了数据库的安全性。
第10章 PL-SQL程序设计

游标的属性操作
•
游标属性用来获取游标状态。 游标属性用来获取游标状态。
名 称 %ISOPEN %FOUND %NOTFOUND %ROWCOUNT 说 明 逻辑值, 游标是否打开。 逻辑值 , 游标是否打开 。 如游标未打开其值为 False,反之为True。 ,反之为 。 逻辑值,游标是否找到一条记录。如游标找到记 逻辑值,游标是否找到一条记录。 录其值为True,反之为 录其值为 ,反之为False。 。 逻辑值, 游标没有找到记录, 逻辑值 , 游标没有找到记录 , 是 %FOUND属性 属性 的逻辑非。 的逻辑非。 返回提取游标记录的行数。 返回提取游标记录的行数。
%TYPE、记录和%ROWTYPE类型 、记录和 类型
• • • •
%TYPE类型:使一个变量与字段的数据类型保持一致 类型: 类型 当数据库表中的字段类型修改后, 。当数据库表中的字段类型修改后,PL/SQL程序中相 程序中相 应变量的类型也随之改变。 应变量的类型也随之改变。 记录类型:是用户自定义的数据类型, 记录类型:是用户自定义的数据类型,记录类型包含 一个或多个相关字段, 一个或多个相关字段,即字段包含的类型可以是不相 同的。通常记录类型用于保存表中记录的变量内容。 同的。通常记录类型用于保存表中记录的变量内容。 %ROWTYPE类型:可以完整的存放数据库表中的整 类型: 类型 行记录, 行记录,并可以使用游标或者游标变量来获取记录中 的数据。 的数据。 表类型( 表类型(略) 示例
本章要学习的内容
• • • • • • • •
PL/SQL语言基础 语言基础 PL/SQL控制结构 控制结构 PL/SQL记录和表 记录和表 游标 过程和函数 触发器 包 异常处理
PL/SQL语言基础 语言基础
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
…
例一
DECLARE tin_rec tin % rowtype ; v_passwd userlog.passwd % type ; errps EXCEPTION ;
BEGIN select * into tin_rec from tin ; select passwd into v_passwd from userlog
WHILE e LOOP
END LOOP ;
FOR i IN 1..10 LOOP
END IF;
END LOOP ;
EXIT [WHEN e] ;例外EXCEPTION WHEN 例外名1 THEN
… WHEN 例外名2 THEN
…… WHEN OTHERS THEN
…… END ;
系统预定义例外
begin
例三
For r1 in c1 loop
i := 0 ; for r2 in c2(r1.kno) loop
i := i + 1 ; if i=1 then
insert into tout values(r2.kno,r2.pno,r2.pdate); l_d:=r2.pdate; elsif r2.pdate = l_d then insert into tout values(r2.kno, r2.pno,r2.pdate); else exit; end if ; end loop; end loop ;
例三
Declare cursor c1 is select distinct kno from clog; cursor c2 (kindno char(3)) is select * from clog where kno=kindno order by day desc ; i number ; l_d date ;
open c1(v_depno) ;
例三
例题: 收发室收文件。文件分类,每类中文件依收到 日期先后顺序编号。值班人员收到文件后,要 在系统中登录文件类别,编号,收到日期。
(注:一天中收到的文件可能不止一份) 编一PL/SQL 程序,查询每一类中最后一天收
到的文件) 表clog(kno 类别 , pno 编号 , pdate 收发日期) 练习要点: 光标FOR循环,带参数的光标
where userid = tin_rec.ud ;
例一
if tin_rec.ps = v_passwd then insert into tout values(`login ok` );
else raise errps ;
end if ; exception when errps then
insert into tout values(`password error`〕; when no_data_found then insert into tout values(`userid error’〕; end;
例二
Close c1; insert into msg values(emp_num , s_sal) ; commit ; end;
光标for循环
For r in c1 loop
r.sal end loop;
如何打开光标 如何读光标区 如何判断读完 如何关闭光标
带参数光标
cursor c1 (depno char(3)) is select * from emp where dno=depno ;
显式光标
定义 delcare cursor c1 is select …
打开 open c1 读 fetch c1 into 变量/记录 close c1
显式光标
读取状态信息 c1%found c1%rowcound
用光标定义记录 temp c1%rowtype
例二
问题:
为职工长工资。从最低工资长,工资总额限 制在50万元。 Declare
二、PL/SQL程序设计
什么是PL/SQL
对SQL的扩充 过程化 后台技术
PL/SQL 程序结构
Declare begin
exception end /
变量类型
v_ename char(10) ; married boolean :=true ; v_ename emp.ename %TYPE ;
dup_val_on_index no_data_found too_many_rows
Select * into …
用户自定义例外
例外名定义 ex1 exception ;
引起例外 raise ex1 ;
例一
用户注册检查
tin : Ud
ps
tout :
msg
userlog : Userid passwd
光标
Oracle 使用Private SQL Area的工作区 执行SQL语句,并保存语句执行结果和 相关的状态信息。
光标是一个PL/SQL结构,利用光标可以 命名这些工作区,并通过光标访问工作 区中的信息。
隐式光标
隐式光标名:SQL 访问: SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND
cursor c1 is select eno,sal from emp order by sal for update of sal ;
emp_num number :=0 ; s_sal number ; e_sal number ; e_eno char(3);
例二
Begin open c1; select sum(sal) into s_sal from emp ; while s_sal<500000 loop fetch c1 into e_eno,e_sal ; exit when c1%notfound ; update emp set sal=sal*1.1 wwhheerereceunrroe=net_oefnco1 ;; s_sal:=s_sal + e_sal*0.1; emp_num:=emp_num+1 ; end loop ;
emp_rec emp % ROWTYPE ;
变量赋值 an_sal :=mon_sal *12 + nvl(comm,0) ;
Select ename INTO v_ename from emp where eno=` e01 ` ;
程序控制结构
IF e1 THEN ELSIF e2 THEN ELSIF e3 THEN ELSE