[bbk4982]第09集 - Chapter 05- Writing Control Structures(01)
2013-04-23 16:50
513 查看
Logic Tables
Build a simple Boolean condition with a comparision operator.AND | TRUE | FALSE | NULL |
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
OR | TRUE | FALSE | NULL |
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
NOT | |
TRUE | FALSE |
FALSE | TRUE |
NULL | NULL |
Boolean Expression or Logincal Expression
What is the value of flag in each case?flag := record_flag AND available_flag;
RECORD_FLAG | AVAILABLE_FLAG | FLAG |
TRUE | TRUE | ?(1) |
TRUE | FALSE | ?(2) |
NULL | TRUE | ?(3) |
NULL | FALSE | ?(4) |
Short-Circuit Evaluation
PL/SQL uses short-circuit evaluation,which means that PL/SQL need not evaluate all of the expression in an IF statements.如果运算符号是AND,FALSE具有黑洞特色;
如果运算符号是OR,TRUE具有黑洞特色;
IF condition1 AND condition2 THEN statements; ELSE statements; END IF;
IF condition1 OR condition2 THEN statements; ELSE statements; END IF;
Demo01:如果condition1计算结果是FALSE,那么condition2就不用计算.
Demo02:如果condition1计算结果是TRUE,那么condition2就不用计算.
Quiz
Is the following statement short-circuit when condition1 is NULL,when condition1 is FALSE?my_boolean := condtion1 AND condition2;
The NULL Statement
NULL除了可以作为一个表达式之外,还可以作为一个Statement.NULL expression;
NULL Statement;
Syntax:
--NULL Statement; NULL;
When you want PL/SQL to do absolutely nothing,you can use the NULL statements.The reasons to the use NULL statement are often the two following scenarios:
Improving program readability.
Using the NULL statement after a label.(oracle 语法规定,标签必须在语句之前.)
DECLARE ... BEGIN IF condition THEN GOTO lastpoint END IF; ... ... ... <<lastpoint>> NULL; END; /
Iterative Control:Loop Statements
Loops repeat a statement(or a sequence of statements) multiple times.There are three loop types:
Basic loop
FOR loop
WHILE loop
Basic Loops
Syntax:LOOP statement1; ... ... ... EXIT [WHEN condition]; END LOOP;
Basic Loops中如果没有EXIT ,就将会是一个死循环.
DECLARE v_countryid loc.country_id%TYPE := 'CA'; v_loc_id loc.location_id%TYPE; v_counter NUMBER(2) := 1; v_new_city loc.city%TYPE := 'Montreal'; BEGIN SELECT MAX(location_id) INTO v_loc_id FROM loc WHERE country_id = v_countryid; LOOP INSERT INTO loc(location_id,city,country_id) VALUES((v_loc_id + v_counter),v_new_city,v_countryid); v_counter := v_counter + 1; EXIT WHEN v_counter > 3; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('Error Occured;'); END; / SELECT location_id,city,country_id FROM loc;
WHILE LOOPS
Syntax:WHILE condition LOOP statement1; statement2; END LOOP;
Use the WHILE loop to repeat statements while a condition is TRUE.
DECLARE v_countryid loc.country_id%TYPE := 'CA'; v_loc_id loc.location_id%TYPE; v_counter NUMBER(2) := 1; v_new_city loc.city%TYPE := 'alta'; BEGIN SELECT MAX(location_id) INTO v_loc_id FROM loc WHERE country_id = v_countryid; /* LOOP INSERT INTO loc(location_id,city,country_id) VALUES((v_loc_id + v_counter),v_new_city,v_countryid); v_counter := v_counter + 1; EXIT WHEN v_counter > 3; END LOOP; */ WHILE v_counter < 4 LOOP INSERT INTO loc(location_id,city,country_id) VALUES((v_loc_id + v_counter),v_new_city,v_countryid); v_counter := v_counter + 1; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('Error Occured;'); END; / SELECT location_id,city,country_id FROM loc;
FOR Loops(PL/SQL中默认的步长是1,不可修改)
Use a For loop to shortcut the test for the number of iterations.Do not declare the counter;it is declared implicity.
FOR counter IN [REVERSE] lower_bound..upper_bound LOOP statement1; statement2; ... END LOOP;
DEMO:REVERSE
BEGIN FOR i IN REVERSE 1..10 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; END; /
DECLARE v_countryid loc.country_id%TYPE := 'CA'; v_loc_id loc.location_id%TYPE; v_counter NUMBER(2) := 1; v_new_city loc.city%TYPE := 'Montreal'; BEGIN SELECT MAX(location_id) INTO v_loc_id FROM loc WHERE country_id = v_countryid; /* LOOP INSERT INTO loc(location_id,city,country_id) VALUES((v_loc_id + v_counter),v_new_city,v_countryid); v_counter := v_counter + 1; EXIT WHEN v_counter > 3; END LOOP; */ FOR i IN 1..3 LOOP INSERT INTO loc(location_id,city,country_id) VALUES((v_loc_id + v_counter),v_new_city,v_countryid); v_counter := v_counter + 1; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('Error Occured;'); END; / SELECT location_id,city,country_id FROM loc;
相关文章推荐
- [bbk4981]第08集 - Chapter 05- Writing Control Structures(00)
- [bbk4984]第10集 - Chapter 05- Writing Control Structures(02)
- 自学PL/SQL 第四讲Writing Control Structures
- Chapter 05-Reporting Aggregated data Using the Group Functions - 01
- Chapter -03 Writing Executable Statements 01
- [bbk3016] 第59集 - Chapter 14-Using Oracle Dasta Storage Structures Efficiently(05)
- CHAPTER 24 VIRTUAL-MACHINE CONTROL STRUCTURES
- 《代码大全2》阅读笔记10--Chapter 17 Unusual Control Structures
- [bbk2864] 第55集 - Chapter 14-Using Oracle Dasta Storage Structures Efficiently(01)
- Chapter 6 - Structures(四).1
- UNIX 读书笔记01 分类: Linux 2015-05-27 22:20 42人阅读 评论(0) 收藏
- chapter 7 recursion(递归) and linked data structures(链接数据结构)
- 【spark 深入学习 05】RDD编程之旅基础篇-01
- 05-01
- Chapter 01 Computer Graphics Hardware
- (原创)c#学习笔记05--变量的更多内容01--类型转换03--使用Convert命令进行显式转焕
- 01_05.border属性
- ES权威指南_01_get start_05 Searching—The Basic Tools
- 读书清单(2008/01 - 2008/05)
- Java语言介绍(04)开源项目(05)博客系统(01)Roller Weblogger