写一些关于PL/SQL的语法,免得等到用到的时候还要去乱翻。
1。控制流程(if,while)
2。循环(for)
3。游标(cursor)
4。异常处理(exception)
1。控制流程()
A.条件语句
IF
1<statement> THEN
2PL/SQL
3END IF;
4
5IF <statement> THEN
6PL/SQL
7ELSE
8PL/SQL
9END IF;
10
11IF <statement> THEN
12PL/SQL
13ELSIF <statement> THEN
14PL/SQL
15END IF;
16
17
182。循环
19
20A.simple loop
21LOOP
22SQL
23EXIT WHEN <statement>;
24END LOOP;
25
26LOOP
27SQL
28IF <statement> THEN
29EXIT;
30END IF;
31END LOOP;
32
33B.While loop
34WHILE <statement> LOOP
35SQL
36END LOOP;
37
38C.For loop
39FOR $counter in $low .. $high LOOP
40SQL
41END LOOP
42
43
443。游标
45
46在PL/SQL程序中定义的游标叫做显式游标。
47
48A.显式游标的处理由四个部分组成:
49cursor $cursorname is $Query; --定义游标
50open $cursorname; --打开游标
51fetch $cursorname into $othervariable --把游标中的东西取出
52close $cursorname --关闭游标
53
54B.游标属性
55%found 布尔型属性,当最近一次读纪录成功 时 ,为true.
56%nofound 失败时,为false.
57%isopen
58%rowcount 返回已从游标中读取的记录数。
59
60C.参数化游标
61
62所有的SQL语句在上下文区内部都是可执行的,因此都有一个游标指向上下文区,此游标就是所谓的SQL游标。
63与显式游标不同,SQL游标不被程序打开和关闭。
64
65
664.异常处理概念
67
68异常处理是用来处理正常执行过程中未预料的事件。如果PL/SQL程序块一旦产生异常而又没有指出如何处理时,程序会自动终止。
69异常处理部分放在PL/SQL的后半部分,结构为:
70
71EXCEPTION
72WHEN first_exception THEN <code exception="" first="" handle="" to="">
73WHEN second_exception THEN <code exception="" handle="" second="" to="">
74WHEN OTHERS THEN < code to handle second exception > \--OTHERS必须放在最后
75
76异常分为预定义和用户定义两种。
77用户定义的异常是通过显式使用RAISE语句来引发。如
78
79
80
81DECLARE
82e_TooManyStudents EXCEPTION; \-- 类型为 Exception ,用于指示错误条件
83v_CurrentStudents NUMBER(3); \-- HIS-101学生注册当前号
84v_MaxStudents NUMBER(3); \-- HIS-101学生注册允许的最大号
85
86BEGIN
87/* 找出注册学生当前号和允许的最大号 */
88
89SELECT current_students, max_students
90
91INTO v_CurrentStudents, v_MaxStudents
92
93FROM classes
94
95WHERE department = 'HIS' AND course = 101;
96
97/* 检查学生的号 */
98
99IF v_CurrentStudents > v_MaxStudents THEN
100
101/* 太多的学生注册,则触发例外处理 */
102
103RAISE e_TooManyStudents;
104
105END IF;
106
107EXCEPTION
108
109WHEN e_TooManyStudents THEN
110
111/* 当太多的学生注册,就插入信息解释发生过错误 */
112
113INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||
114
115'students: max allowed is ' || v_MaxStudents);
116
117END;
118
119
120END;
121
122用户定义的的异常处理
123可以使用RAISE_APPLICATION_ERROR来创建自己的错误处理:
124RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
125其中 error_number是从-20000到-20999之间的参数; error_message是相应的提示信息,小于512字节。如:
126
127
128CREATE OR REPLACE PROCEDURE Register (
129p_StudentID IN students.id%TYPE,
130p_Department IN classes.department%TYPE,
131p_Course IN classes.course%TYPE) AS
132v_CurrentStudents NUMBER; \-- 班上学生的当前号
133v_MaxStudents NUMBER; \-- 班上学生的最大号
134
135
136BEGIN
137/* 找出学生的当前号和最大号 */
138SELECT current_students, max_students
139INTO v_CurrentStudents, v_MaxStudents
140FROM classes
141WHERE course = p_Course
142AND department = p_Department;
143
144
145/* 确认另外的学生是否有足够的教室 */
146IF v_CurrentStudents + 1 > v_MaxStudents THEN
147RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
148p_Department || ' ' || p_Course);
149END IF;
150
151
152/* 加一个学生在本班 */
153ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
154
155EXCEPTION
156WHEN NO_DATA_FOUND THEN
157RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
158' doesn''t exist!');
159END Register;</code></code></statement></statement></statement></statement></statement></statement></statement>