您的位置:首页 > 其它

[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.

ANDTRUEFALSENULL
TRUETRUEFALSENULL
FALSEFALSEFALSEFALSE
NULLNULLFALSENULL
      

ORTRUEFALSENULL
TRUETRUETRUETRUE
FALSETRUEFALSENULL
NULLTRUENULLNULL
NOT
TRUEFALSE
FALSETRUE
NULLNULL

Boolean Expression or Logincal Expression

What is the value of flag in each case?

flag := record_flag AND available_flag;

RECORD_FLAGAVAILABLE_FLAGFLAG
TRUETRUE?(1)
TRUEFALSE?(2)
NULLTRUE?(3)
NULLFALSE?(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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: