第七章 使用PL/SQL编程
初识PL/SQL(Procedure Language & Structured Query Language)
PL/SQL是Oracle在标准SQL语言上的过程性扩展,允许嵌入SQL语句,定义变量和常量允许过程语言结构(条件分支语句和循环语句)允许使用异常来处理Oracle错误 可以用于创建存储过程、触发器和程序包等,也可以用于处理业务 规则、数据库事件或给SQL命令的执行添加程序逻辑
普通SQL语言只能实现访问,操作数据;
PL/SQL可以实现流程控制,异常处理,创建可存储的代码块;
PL/SQL块
所有的PL/SQL程序都以块作为基本单位
块中包含过程化语句和SQL的DML语句。这些块可以按顺序出现,也可以相互嵌套(一个块在另一个块的内部)
块的分类
1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。
2. 命名块(named):是带有名称的匿名块,这个名称就是标签。
3. 子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。
4. 触发器(Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
5. 程序包/包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。
PL/SQL块的结构
示例1:
DECLARE
V_NAME varchar2(20) := '郭老师';
BEGIN
DBMS_OUTPUT.put_line(V_NAME||'的第一条PL/SQL语句');
END;
与用户交互输入参数
declare
v_name varchar2(20):= '&input_name';
begin
dbms_output.put_line(v_name||'的第一条PL/SQL语句');
end;
示例2:
DECLARE
v_name1 varchar2(32);
v_name2 varchar2(32) := 'ABC';
v_num1 number := 13;
v_num2 number;
BEGIN
dbms_output.put_line(v_name1);
dbms_output.put_line(v_name1 || v_name2);
dbms_output.put_line(v_num1);
dbms_output.put_line(v_num1 + v_num2);
END;
注意:
1. 声明变量时,必须要指定类型
2. 变量名需要先赋值,后使用
3. 变量名没有默认值(表现是空,无意义)
示例3:
CONSTANT 定义常量值,定义后无法修改
DECLARE
v_number1 number := 13;
v_number2 CONSTANT number := 3.14;
BEGIN
DBMS_OUTPUT.put_line(v_number1 * v_number2);
END;
示例4:
变量与指定的列的类型一致 采用%TYPE
DECLARE
v_num1 employees.salary%type := 13.234;
v_num2 employees.manager_id%type := 2;
BEGIN
DBMS_OUTPUT.put_line(v_num1 / v_num2);
END;
示例5:
DML结果装载入PLSQL变量
declare
v_salary employees.salary%type;
begin
select salary into v_salary from employees where employee_id=198;
DBMS_OUTPUT.put_line('v_salary:'||v_salary);
end;
示例6:
%ROWTYPE表示数据类型是一行数据
DECLARE
v_emp employees%rowtype;
BEGIN
select * into v_emp from employees where employee_id = 100;
dbms_output.put_line('部门编号:'||v_emp.department_id ||
' 员工姓名:'|| v_emp.first_name);
END;
insert操作,接收返回值
示例6:
返回值拼接
update操作,接收返回值
示例7:
delete操作,接收返回值
示例8:
数组类型
题:通过用户输入的员工号,查询一行记录
异常处理
异常名称 |
异常编码 |
异常解释 |
TIMEOUT_ON_RESOURCE |
ORA-0051 |
发生超时 |
TOO_MANY_ROWS |
ORA-1422 |
SELECT INTO命令返回的多行 |
TRANSACTION_BACKED_OUT |
ORA-006 |
由于死锁提交被退回 |
VALUE_ERROR |
ORA-6502 |
转换或者裁剪错误 |
ZERO_DIVIDE |
ORA-1476 |
试图被零除 |
LOGIN_DENIED |
ORA-1017 |
无效的用户名或者口令 |
NO_DATA_FOUND |
ORA-1403 |
查询未找到数据 |
NOT_LOGGED_ON |
ORA-1012 |
还未连接就试图数据库操作 |
PROGRAM_ERROR |
ORA-6501 |
内部错误 |
ROWTYPE_MISMATCH |
ORA-6504 |
主变量和光标的类型不兼容 |
STORAGE_ERROR |
ORA-6500 |
内部错误 |
ACCESS_INTO_NULL |
ORA-6530 |
试图访问一个未初始化的对象时出现 |
CASE_NOT_FOUND |
ORA-6592 |
CASE语句中的选项与用户输入数据不匹配时出现 |
CURSOR_ALREADY_OPEN |
ORA-6511 |
试图打开一个已打开的光标 |
DUP_VAL_ON_INDEX |
ORA-0001 |
试图破坏一个唯一性限制 |
INVALID_CURSOR |
ORA-1001 |
试图使用一个无效的光标 |
INVALID_NUMBER |
ORA-1722 |
试图对非数字值进行数字操作 |
流程控制
if
IF <布尔表达式> THEN
PL/SQL 和 SQL语句
ELSE
其它语句
END IF;
case
CASE 条件表达式
WHEN 条件表达式结果1 THEN
语句段1
WHEN 条件表达式结果2 THEN
语句段2
......
WHEN 条件表达式结果n THEN
语句段n
[ELSE 条件表达式结果]
END;
loop 三种循环方法
LOOP
要执行的语句;
EXIT WHEN <条件语句>; --条件满足,退出循环语句
END LOOP;
while
WHILE <布尔表达式> LOOP
要执行的语句;
END LOOP;
for 推荐
FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
要执行的语句;
END LOOP ;
IN 每次循环加一;
IN REVERSE 每次循环减一;
EXIT 退出循环;
数组的输出采用for循环方式,打印出来
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!