第四章 PL/SQL控制结构 If-then:如果条件为true,则执行一行或多行代码,如果条件为假,转到end if之后。

Slides:



Advertisements
Similar presentations
仪 容. 一、化妆的技巧 眼部的化妆 唇部化妆 眉部化妆 鼻部化妆 根据脸型化妆 根据脸型选发型.
Advertisements

第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
1 程式語言 Visual Basic 循序結構、選擇結構 黃瀧輝 老師 Long Hwai,Huang.
Visual Basic 程序设计 第四讲.
强力推进 积极探索 努力提升计算机审计实施水平 AO案例和审计方法撰写介绍 曹红珍.
第5章 T-SQL语言 5.1 SQL语言与T-SQL语言 5.2 常量、变量与数据类型 5.3 运算符与表达式 5.4 流程控制语句
5.1 掌握Power Scrip语言 5.2 使用控件 实训五 控件应用
第 4 章 PHP 基本語法.
目 录 第 1 章 数据库技术基础 第 2 章 SQL Server基础 第 3 章 数据库管理 第 4 章 查询和视图
課程名稱:程式設計 授課老師:________
数据库技术 实践.
高等院校计算机教材系列 数据库原理与应用(第2版) 任课教师:刘雅莉
Access数据库程序设计 总复习.
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
文科计算机小公共课规划教材 Access 程序设计.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
出隊服務經驗分享 分享人:大丁.
Chapter 4 流程控制.
PL/SQL程序设计 过程, 函数 Trigger 对象关系数据库技术.
主机DB2数据库应用与编程 任课老师:王湖南 四川大学计算机(软件)学院.
数据库技术 第十章 数据库完整性 中国科学技术大学网络学院 阚卫华.
第四章:触发器   触发器类似于过程、函数,因为它们都是拥有说明部分、语句执行部分和异常处理部分的有名的PL/SQL块。与包类似,触发器必须存储在数据库中,并且不能被块进行本地化说明。但是,对于过程而言,可以从另一个块中通过过程调用显式地执行一个过程,同时在调用时可以传递参数。对于触发器而言,当触发事件发生时就会显式地执行该触发器,并且触发器不接受参数。
Chapter 1 複習.
ORACLE 第五讲 PL/SQL编程基础.
控制流程 邏輯判斷 迴圈控制.
第 8 章 資料的 新增、修改與刪除.
解题报告 刘非.
VHDL數位電路實習與專題設計 文魁資訊-UE301
第五章 shell 编程 shell 编程的基本过程分为三步: 1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
Transact-SQL 語言設計教學.
程式語言 I – VISUAL BASIC 選擇結構語法與應用 Chapter 7 認知
欢迎参加VHDL培训 VHDL培训教程 浙江大学电子信息技术研究所 电子设计自动化(EDA)培训中心
C 語言簡介 - 2.
Access VBA程序设计 本章重点 Access Basic编程语言 运算符、函数与表达式 Access Basic语句 模块的使用
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
流程控制、陣列 台南市聖功女子高級中學 毛全良.
程式語言Visual Basic 重複結構 黃瀧輝 老師 Long Hwai,Huang.
SQL SERVER 一些经典语句 1.
实验4:PL-SQL编程 1.实验目的 2.实验原理 PL/SQL是一种过程化语言,属于第三代语言,本实验在与熟悉使用PL/SQL编程.
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
iRepor报表设计基础 IReport安装 普通实体报表 数据结果集报表 工作流主从报表 饼状图报表 柱状图,曲线图报表 条形码报表
第12章 shell编程基础 本章主要介绍shell编程的基础知识。shell脚本的执行类似于Linux下的任何其他命令,脚本可以包含复杂的逻辑,也可以包含一系列Linux命令行指令。在一个shell程序内可以运行其他shell脚本。通过本章的学习,读者可以学到如何使用bash(最流行的Linux.
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
ORACLE 第九讲 触发器.
第五章 VHDL主要描述语句.
江西财经大学信息管理学院 《数据库应用》课程组2007
数据库技术.
软件测试 (四)静态测试与动态测试.
小结 郭清溥.
Ch04 VB.NET的流程控制 網頁程式設計.
软件工程 第四章 软件设计 软件过程设计技术与工具.
程式結構&語法.
4.2 视图 (1) 视图是一个虚拟表,其内容来自对表查询的基础上。
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
学习目标 1、什么是表连接 2、表连接类型 3、表连接区别.
第二章、第三章错题分析.
程式的時間與空間 Time and Space in Programming
Oracle Database 10g基础教程 清华大学出版社
第四章 控制结构 1、顺序控制结构 2、选择结构 3、循环结构.
單元名稱:結構化程式設計 報告人 劉洲溶.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
第二章 Java基本语法 讲师:复凡.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
顺序查找与二分查找复习.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
解题报告 七(5)班 严崟杰 03:20.
Presentation transcript:

第四章 PL/SQL控制结构 If-then:如果条件为true,则执行一行或多行代码,如果条件为假,转到end if之后。 4.1 条件控制 4.1.1 IF-THEN语句 If-then:如果条件为true,则执行一行或多行代码,如果条件为假,转到end if之后。 例:if var1>10 then var2:=var1+20; end if If语句允许嵌套,如: If var1>10 then if var2<var1 then end if; End if; 规则1:每个if语句都有自己的then,以if开始的语句行不跟; 规则2:每个if语句块以相应的end if结束。

4.1.2 IF-THEN-ELSE语句 例: If var1>10 then var2:=var1+20; Else var2:=var1*var1; End if; If-then-else语句也可以嵌套。例: if var1 between 7 and 8 then var2:=2*var1; else end if;

4.1.3 IF-THEN-ELSIF语句 这种结构用于替代嵌套if-then-else结构。上例可改写为: 规则3:每个if语句有且只有一个else。 规则4:else语句行不跟;  4.1.3 IF-THEN-ELSIF语句 这种结构用于替代嵌套if-then-else结构。上例可改写为: If var1>10 then var2:=var1+20; Elsif var1 between 7 and 8 then var2:=2*var1; Else var2:=var1*var1; End if; 规则5:elseif无匹配的end if **编程采用缩进结构。

Else不是必须的。例: If location=‘phonex’ then v_hockey_team_name:=‘coyotes’; Elsif location=‘new york city’ then v_hockey_team_name:=‘ranges’; Elsif location:=‘ottawa’ then v_hockey_team_name:=‘senators’; End if; null条件:if-then-else语句的条件为true时,执行then后的语句,条件为false或null时,执行else后的语句。考虑两个块:

/* block1 */ Declare v_number1 number; v_number2 number; v_result varchar2(7); Begin if v_number1<v_number2 then v_result:=‘yes’; else v_result:=‘no’; end if; End;

/* block2 */ Declare v_number1 number; v_number2 number; v_result varchar2(7); Begin if v_number1>=v_number2 then v_result:=‘no’; else v_result:=‘yes’; end if; End; 当v_number1和v_number2的值非null时,这两个块等价,但是,当其中之一为null时,这两个块就不同。如v_number1=3,v_number2为null,块1的结果为no,块2的结果为yes。

如果对上面两个块添加对null的检测,则这两个块等价。 /* block1 */ Declare v_number1 number; v_number2 number; v_result varchar2(7); Begin if v_number1 is null or v_number2 is null then v_result:=‘unknown’; elsif v_number1<v_number2 then v_result:=‘yes’; else v_result:=‘no’; end if; End;

/* block2 */ Declare v_number1 number; v_number2 number; v_result varchar2(7); Begin if v_number1 is null or v_number2 is null then v_result:=‘unknown’; elsif v_number1>=v_number2 then v_result:=‘no’; else v_result:=‘yes’; end if; End;

4.1.4 CASE语句 语法如下: Case selector when expression1 then sequence_of_statement1; when expression2 then sequence_of_statement2; ……….. when expressionN then sequence_of_statementN; [else sequence_of_statementN+1;] End case 例: Declare grade char:=‘A’; begin if grade =‘A’ then dbms_output.put_line(‘Excellent’);

elsif grade=‘B’ then dbms_output.put_line(‘very good’); elsif grade=‘C’ then dbms_output.put_line(‘good’); elsif grade=‘D’ then dbms_output.put_line(‘fair’); elsif grade=‘F’ then dbms_output.put_line(‘poor’); else dbms_output.put_line(‘no such grade’); end if; End;

用case语句重写以上程序如下: Declare grade char:=‘A’; Begin case grade when ‘A’ then dbms_output.put_line(‘Excellent’); when ‘B’ then dbms_output.put_line(‘very good’); when ‘C’ then dbms_output.put_line(‘good’); when ‘D’ then dbms_output.put_line(‘fair’); when ‘F’ then dbms_output.put_line(‘poor’); else dbms_output.put_line(‘no such grade’); end case; End;

4.1.5 搜索CASE语句 语法如下 Case when search_condition1 then sequence_of_statement1; when search_condition2 then sequence_of_statement2; … when search_conditionN then sequence_of_statementN; [else sequence_of_statementN+1;] END CASE 例:上例改写如下:

Declare grade char:=‘A’; Begin case when grade=‘A’ then bms_output.put_line(‘Excellent’); when grade=‘B’ then dbms_output.put_line(‘very good’); when grade=‘C’ then dbms_output.put_line(‘good’); when grade=‘D’ then dbms_output.put_line(‘fair’); when grade=‘F’ then dbms_output.put_line(‘poor’); else dbms_output.put_line(‘no such grade’); end case; End;

Loop-exit-end循环:此循环有三部分组成,见下例 4.2 循环结构 4.2.1 LOOP循环 Loop-exit-end循环:此循环有三部分组成,见下例 Cnt:=1; Loop cnt:=cnt+1; if cnt>=100 then exit; end if; … End loop; Loop-exit-when-end循环:例 Declare cnt binary_integer:=1; insert into temp_table values (cnt,’loop index’); exit when cnt>=100; end loop; End;

4.2.2 WHILE-LOOP循环 在while部分测试退出条件。例 Declare cnt binary_integer:=1; while cnt<=100 loop insert into temp_table values (cnt,’loop index’); cnt:=cnt+1; end loop; End;

4.2.3 FOR循环 语法如下: For loop_counter in [reverse] low_bound ..high_bound loop .. End loop; 这里loop_counter是隐式声明的索引变量。例: Begin for v_counter in 1..50 loop insert into temp_table values (v_counter,’loop index’); end loop; End; 域法则:for循环的循环索引被隐式声明为binary_integer,在循环前面没有必要声明他。如果对他进行了声明,那么循环索引将隐蔽外层的声明。正如内部块的声明会隐蔽外部块的声明一样。

如: Declare v_counter number:=7; Begin insert into temp_table(num_col) values (v_counter); for v_counter in 20..30 loop end loop; End;

使用reverse:如果在for循环中有reverse关键字,则循环索引将从最大值向最小值进行迭代。仍然是先写小值,后写大值。 Begin for v_counter in reverse 10..100 loop null; end loop; End; 循环范围:最大值和最小值没有必要是数值文字,他们可以是能够被转换为数字值的任何表达式。例: Declare v_lowervalue number:=10; v_highvalue number:=40; for v_counter in v_lowervalue ..v_highvalue loop insert into temp_table values (v_counter,’dynamically specified loop range’);

4.2.4 循环语句使用指导

4.3 顺序结构 4.3.1 GOTO语句 语法如下: Goto label; 4.3 顺序结构 4.3.1 GOTO语句 语法如下: Goto label; Label是用<<>>括起来定义的标号。 例: Declare v_counter binary_integer :=1; Begin loop insert into temp_table values (v_counter,’loop count’); v_count:=v_count+1; if v_count>50 then goto l_endofloop; end if; end loop; <<l_endofloop>> insert into temp_table (char_col) values “done”; End;

1.对于goto的限制:对于块、循环、if语句,不能从外层转到内层。下例是非法的: begin goto l_innerblock; <<l_innerblock>> … end; goto l_insideif; if x>3 then <<l_insideif>> insert into … end if; End;

使用goto语句从一个if语句块转到另一个子句也是非法的。 例: Begin if x>3 then … goto l_nextcondition; else <<l_nextcondition>> end if; End;

从一个异常处理块的内部跳到当前执行块是非法的。 例: Declare select * into v_room from rooms where roomid=1; <<l_insert>> insert into temp_table (char_col) values (‘found a row’); Exception when no_data_found yhen goto l_insert; End; 2.为循环设定标签 循环可以设定标签,在exit语句中可以使用标签指明退出退出哪个循环。

例: Begin <<l_outer>> for v_outerindex in 1..50 loop … <<l_inner>> for v_innerindex in 2..10 loop if v_innerindex>40 then exit l_outer; end if; end loop l_inner; end loop l_out; End;

4.3.2 NULL语句 如果想显式第指明进行任何操作,可以使用null语句,他只是一个占位符。例 Declare v_tempvar number :=7; Begin if v_tempvar<5 then insert into temp_table (char_col) values (‘too small’); elsif v_numvar<10 then insert into temp_table(char_col) values (‘just right’); else null; end if; End;