写一些关于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; | |