PL/SQL的一些语法
2024-07-21 02:40:14
供稿:网友
写一些关于PL/SQL的语法,免得等到用到的时候还要去乱翻。
1。控制流程(if,while)
2。循环(for)
3。游标(cursor)
4。异常处理(exception)
1。控制流程()
A.条件语句
IF <statement> THEN
PL/SQL
END IF;
IF <statement> THEN
PL/SQL
ELSE
PL/SQL
END IF;
IF <statement> THEN
PL/SQL
ELSIF <statement> THEN
PL/SQL
END IF;
2。循环
A.simple loop
LOOP
SQL
EXIT WHEN <statement>;
END LOOP;
LOOP
SQL
IF <statement> THEN
EXIT;
END IF;
END LOOP;
B.While loop
WHILE <statement> LOOP
SQL
END LOOP;
C.For loop
FOR $counter in $low .. $high LOOP
SQL
END LOOP
3。游标
在PL/SQL程序中定义的游标叫做显式游标。
A.显式游标的处理由四个部分组成:
cursor $cursorname is $Query; --定义游标
open $cursorname; --打开游标
fetch $cursorname into $othervariable --把游标中的东西取出
close $cursorname --关闭游标
B.游标属性
%found 布尔型属性,当最近一次读纪录成功时,为true.
%nofound 失败时,为false.
%isopen
%rowcount 返回已从游标中读取的记录数。
C.参数化游标
所有的SQL语句在上下文区内部都是可执行的,因此都有一个游标指向上下文区,此游标就是所谓的SQL游标。
与显式游标不同,SQL游标不被程序打开和关闭。
4.异常处理概念
异常处理是用来处理正常执行过程中未预料的事件。假如PL/SQL程序块一旦产生异常而又没有指出如何处理时,程序会自动终止。
异常处理部分放在PL/SQL的后半部分,结构为:
EXCEPTION
WHEN first_exception THEN <code to handle first exception>
WHEN second_exception THEN <code to handle second exception>
WHEN OTHERS THEN <code to handle second exception> --OTHERS必须放在最后
异常分为预定义和用户定义两种。
用户定义的异常是通过显式使用RAISE语句来引发。如
DECLARE
e_TooManyStudents EXCEPTION; -- 类型为Exception,用于指示错误条件
v_CurrentStudents NUMBER(3); -- HIS-101学生注册当前号
v_MaxStudents NUMBER(3); -- HIS-101学生注册答应的最大号BEGIN
/* 找出注册学生当前号和答应的最大号 */ SELECT current_students, max_students INTO v_CurrentStudents, v_MaxStudents FROM classes
WHERE department = 'HIS' AND course = 101; /* 检查学生的号 */ IF v_CurrentStudents > v_MaxStudents THEN/* 太多的学生注册,则触发例外处理 */ RAISE e_TooManyStudents; END IF;EXCEPTION WHEN e_TooManyStudents THEN /* 当太多的学生注册,就插入信息解释发生过错误 */ INSERT INTO log_table (info) VALUES ('History 101 has ' v_CurrentStudents 'students: max allowed is ' v_MaxStudents);END;
END;
用户定义的的异常处理
可以使用RAISE_application_ERROR来创建自己的错误处理:
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
其中error_number是从-20000到-20999之间的参数;error_message是相应的提示信息,小于512字节。如:
CREATE OR REPLACE PROCEDURE Register (
p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) AS
v_CurrentStudents NUMBER; -- 班上学生的当前号
v_MaxStudents NUMBER; -- 班上学生的最大号
BEGIN
/* 找出学生的当前号和最大号 */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE course = p_Course
AND department = p_Department;
/* 确认另外的学生是否有足够的教室*/
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to '
p_Department ' ' p_Course);
END IF;
/* 加一个学生在本班 */
ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, p_Department ' ' p_Course
' doesn''t exist!');
END Register;