Pl/SQL语言
一、背景
1.PL/SQL简介
PL/SQL是一种过程化语言,属于第三代语言(3GL),它与BASIC、C++、JAVA等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。
PL/SQL是Oracle对关系数据库语言SQL的过程化扩充。PL/SQL集成了现代软件工程特,将数据库技术和过程化程序设计语言连接起来,是一种应用开发工具。从Oracle 8开始,PL/SQL的版本与Oracle数据库版本开始同步。2.PL/SQL语言特点
PL/SQL是一种完全可移植的、高性能的事务处理语言。使用PL/SQL可以编写具有很多高级功能的程序,虽然通过多个SQL语句可能也能实现同样的功能,但是相比而言,PL/SQL具有更为明显的一些优点:
(1)支持SQL语言。SQL由于它的灵活、功能强和容易掌握等特点,已成为关系数据库的标准
语言。PL/SQL允许使用全部DML语句、游标控制语句、事物控制语句,以及全部SQL函数、运算符等。
(2)更高的开发效率。在Oracle提供发开发环境中,借助于使用先进的开发工具可提高编程效率。
(3)更高的性能。在PL/SQL产生以前,Oracle每次处理一条语句,就会调用一次Oracle,网络开销很大。PL/SQL产生以后,一个完整的PL/SQL程序块一次发送到Oracle,减少了Oracle的调用和通信次数,可节省时间及降低网络通信量,提高性能。
(4)可移植性。使用PL/SQL所编程的程序,可移植到Oracle运行的任何操作系统平台上,不需做任何修改。
(5)与Oracle相集成。PL/SQL和Oracle都是基于SQL的,而且PL/SQL支持SQL全部数据。
2.编程基础知识
1.程序结构
PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(用declare开头)、执行部分(以 begin开头)和异常处理部分(以exception开头)。其中执行部分是必须的,其他两个部分可选。无论PL/SQL程序段的代码量有多大,其基本结构就是由这三部分组成。
PL/SQL匿名块,是指动态生成的,只能执行一次,没有名字,不能由其他应用程序调用。例如:
SQL>SET SERVEROUTPUT ON
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE(‘This is a minimum anonymous block’);
3 END;
4 /
This a minimum anonymous block
PL/SQL命名块是指一次编译可多次执行的PL/SQL程序,包括自定义函数、过程、包、触发器等。它们编译后放在服务器中,由应用程序或系统在特定条件下调用执行。
2.控制结构
PL/SQL程序段中有三种程序结构:条件结构、循环结构和顺序结构。
(1)条件结构
与其它语言完全类似,语法结构如下:
IF condition then
STATEMENT 1
ELSE
STATEMENT 2
end if;
(2)循环结构
这一结构与其他语言不太一样,在PL/SQL程序中有三种循环结构:
1) loop … end loop;
2)while condition loop … end loop;
3) for variable in low_bound . . upper_bound loop … end loop;
其中的“…”代表循环体。
(3)顺序结构
实际就是goto的运用,不过从程序控制的角度来看,尽量少用goto可以使得程序结构更加的清晰。
三、异常处理
1.异常的基本概念
(1)异常处理机制
PL/SQL程序的错误可以分为两类:一类是PL/SQL语法错误,由PL/SQL编译器发现并给出错误信息;另一类是运行时引擎发现并给出错误信息。编译器发现的错误,由于不修改程序就无法执行,因此编译错误由程序员来修改;运行时错误是随着运行环境的变化而随时出现的,难以预料,因此需要在程序中尽可能地考虑各种可能的错误。
(2)异常分类
PL/SQL语言的异常分为两大类,一类是Oracle系统异常,另一类是自定义异常。Oracle系统异常又分为两种,一种为预定义异常,另一种为非预定义异常。为了处理PL/SQL应用程序可能出现的各种错误,开发人员总结了三种类型的异常。
1)预定义异常
预定义异常是Oracle系统异常中的一种,用于处理常见的Oracle错误。其特点是,Oracle系统定义了它们的错误编号与异常名字。对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
2)非预定义异常
非预定义异常也是Oracle系统异常的一种,用于处理异常预定义以为的Oracle系统错误。其特点是Oracle系统定义了它们错误的编号,但没有定义异常名字。当运行PL/SQL代码产生错误时,与错误代码对应的非预定义异常被自动抛出,通过定义异常名字捕获该异常,并对错误进行处理。
3)自定义异常
自定义异常用于处理用户定义错误,即处理与Oracle系统无关的其他错误。自定义异常是指有些操作并不会产生Oracle系统错误。
2.系统异常处理
(1)预定义异常
预定义异常由系统隐式定义和抛出,因此只需编写异常捕获及处理部分的代码。
SQL>DECLARE
2 v_dividend NUMBER:=50;
3 v_divisor NUMBER:=0;
4 v_quotient NUMBER;
5 BEGIN
6 v_quotient :=v_dividend/v_divisor;
7 EXCEPTION
8 WHEN ZERO_DIVIDE THEN
9 DBMS_OUTPUT.PUT_LINE(‘除数为零!’);
10 END;
11 /
除数为零!
(2)非预定义异常
1)因为非预定义异常只有编号,没有名称,所以不能直接处理。
在PL/SQL 块的定义部分定义异常情况:
<异常情况> EXCEPTION;
2)将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:
PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
3) 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
[SQL] >INSERT INTO departments VALUES(50, 'FINANCE', 'CHICAGO');
2 DECLARE
3 v_deptno departments.department_id%TYPE := &deptno;
4 deptno_remaining EXCEPTION; ——定义异常
5 PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); ——关联
——2292 是违反一致性约束的错误代码
6 BEGIN
7 DELETE FROM departments WHERE department_id = v_deptno;
8 EXCEPTION
9 WHEN deptno_remaining THEN ——处理
10 DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
11 WHEN OTHERS THEN
12 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
13 END;
(3)用户自定义异常处理
用户定义的异常错误是通过显式使用 RAISE 语句来触发。
1)在PL/SQL 块的定义部分定义异常情况 ;
2)RAISE <异常情况>;
3)在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
[SQL] >DECLARE
2 v_ployee_id%TYPE := &empno;
3 no_result EXCEPTION; ——定义
4 BEGIN
5 UPDATE employees SET salary = salary+100 WHERE employee_id =v_empno;
6 IF SQL%NOTFOUND THEN
7 RAISE no_result; ——抛出
8 END IF;
oracle游标的使用9 EXCEPTION
10 WHEN no_result THEN ——处理
11 DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
12 WHEN OTHERS THEN
13 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
14 END;
15 /
RAISE_APPLICATION_ERROR调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,将应用程序专有的错
误从服务器端转达到客户端应用程序。它为应用程序提供了一种与ORACLE交互的方法。
4、游标
在PL/SQL程序中执行查询语句或数据操纵语句时,一般都可能产生或处理一组记录。游标是为处理这些记录而分配的一段内存区。
根据记录集中记录数量的不同,将游标分为两类,其中记录集中中只有单行数据时,系统自动进行定义游标,称为隐式游标(Implicit Cursor)。记录集中具有多行数据时,需要由用户定义游标,称为显式游标(Explicit Cursor)。
1.游标使用步骤
使用显式游标,需要经过(Declare)游标、打开(Open)游标、读取(Fetch)游标数据及关闭(Close)游标等4个步骤。
(1)声明游标
使用显式游标,必须首先在PL/SQL程序段进行定义,格式如下:
CURSOR cursor_name IS select_statement;
以下是一个游标定义实例:
DECLARE
CURSOR students_cur
IS
SELECT name,dob
FORM students
WHERE specialty = ‘计算机’;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论