PL/SQL程序结构
目的:实现复杂的业务逻辑
基本结构
基本结构:块
块与块之间可以可以相互嵌套
块包括:声明部分,执行部分,异常处理部分
-
声明部分:
用于定义常量、变量、游标、异常和复杂数据类型等;
-
执行部分:
用于实现应用模块功能,该部分包含需要执行的PL\SQL语句和SQL语句;
-
异常处理部分:
用于执行部分可能出现的运行错误。
基本语法
declare -- 有变量声明的时候写;
-- 声明
-- 变量 变量名 数据类型; (直接赋值)变量名 数据类型:=值;
-- 常量 名 constant 数据类型: = ?;
-- 游标
-- 异常 名exception;
-- 一些复杂的数据类型 %rowtype %row table 可以没有声明
begin -- 必须有
-- 主要核心代码,sql处理
-- 1、给变量赋值 select 列1,列2...... into 变量1,变量2 from table where 条件
--2、insert update select delectable
-- 3判断、循环
exception
-- 付begin中的代码有异常的进行处理。
when 异常类型 then dbms_output.put_line(); -- 输出异常
-- 多个异常
when ......
when others......-- 也可以没有异常
end; --必须有
-- 示例:用匿名块来表达一下接收用户输入的员工编号,输出改员工的姓名,以及处理用户输入的员工编号不存在的异常:
declare
v_empno number(5):=&e;--接收录入值:&固定;e随便起
v_ename varchar2(200);
begin
-- 具体代码,select into 给变量赋值
select ename into v_ename from emp where empno=v_empno;
-- 输出system.out.print || 字符串拼接;
dbms_output.put_line('姓名为:'|| v_ename);
exception
-- 异常处理 no_data_found 没有查到任何内容;输出异常信息
when no_data_found then dbms_output.put_line('查无此人');
end;
-- 圆周率 圆面积 π 半径 面积
declare
v_pai constant number(7,2):=3.14; -- constant 常量值;
v_r number(3,1):= &e;
v_area number(9,2);
begin
v_Area:=v_pai*v_r*v_r;
dbms_output.put_line(v_area);
end;
-- sql块中可以放那些语句
-- select into
-- update、insert、delete、commit、rllback;
-- drop table、alter table、create table、select;
-- declare 有变量声明的时候
begin
select * from emp;
end;
编程规则
- 每条语句必须以分号结束。一条语句可以写多行,一行可以写多个语句
- END后必须有分号
- 只能用DML语句, 不能用DDL语句
PL块分类
- 匿名块:无名,只执行一次
- 子程序:带名字,可存储,多次使用
- 触发器:满足触发事件就自动执行相应的;DBMS自动维护;与用户无关的;目的:可保证数据库的安全
变量
简单变量,复合变量
标量变量
定义
赋值
直接赋值
select into赋值
成功前提条件:into
语句前后要类型匹配,数量匹配
%TYPE
使用某列的属性来对变量进行数据类型规定
可以在操作中,一定保证类型一致
优点:
- 所引用的数据库中的表列的数据类型及长度可以不必知道
- 所引用的数据库的=中表列的数据类型可以实时改变;但不会影响
%TYPE
类型变量的声明和使用。使得表的结构和程序的结构是分开的 - 提高块的效率和健壮性
%ROWTYPE
类似结构体
保存一行的属性保持一致,属性名也是相同的,一一对应
定义
变量名 表名%ROWTYPE
取值
.属性名
替换变量
目的为了增强交互性
变量名前增加了&
在声明中,执行部分中,变量前增加了&就会等待输入
本质是原封不动的替换下面的&e
declare
v_empno number(5):=&e;--接收录入值:&固定;e随便起
v_ename varchar2(200);
注意:
- 数值型可直接输入
- 字符型或date需要加单引号
- 如果语句中增加了单引号,就不需要输入了单引号
Sno=&sno
Sno='&sno'
控制结构
也有三种
条件结构
if
if 条件1 then
语句1;
elsif 条件2 then
语句2;
else
语句
end if;
case
case 选择变量名
when 表达式1 then 语句序列1;
when 表达式1 then 语句序列1;
when 表达式1 then 语句序列1;
when 表达式1 then 语句序列1;
else 语句序列
end case;
pl语言里,匹配之后直接运行到END
循环结构
loop
-- 基本loop循环
loop
执行语句;
exit [when <条件>];
end loop;
-- 条件为真就退出
-- 没有when就遇到exit就退出
while loop
while <条件> loop
执行语句;
end loop;
条件为真执行
for loop
for 控制变量 in [reverse] 下限..上限 loop
执行语句:
end loop;
-- 1-100的和
declare v_sum number(4):=0;
begin
for v_count in 1..100 loop
v_sum:=v_sum + v_count;
dbms_output.put_line('V_count 当前的值为' || v_count)
end loop;
dbms_output.put_line('V_sum 当前的值为' || v_sum)
end;
异常处理
exception