PL/SQL的一些语法


写一些关于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 &lt; code to handle second exception  &gt; \--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 &gt; 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 &gt; 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>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus