>dbms_output.put_line (vtotal); end; / 注意:在执行块之前,要在SQL PLUS中执行:SET SERVEROUTPUT ON 三、以实例来说明函数的参数声明作用域 declare v_weight number(3):=600; v_message varchar2(255):=''''product10000''''; begin declare --sub-block v_weight number(3):=1; v_message varchar2(255):=''''pro300''''; begin v_weight:=v_weight +1; end; v_weight:=v_weight +1; v_message:=v_message || ''''my name''''; end; / 子块中的V_WEIGHT值为 2 我们可以在子块中加入:dbms_output.put_line(''''subblock value is ''''||v_weight); 在主体中加入:dbms_output.put_line(''''main value is ''''||v_weight); 我们发现MAINBLOCK中V_WEIGHT为 601 改动: 1、在主块的声明中加 v_date date default sysdate; 在子块中加入:dbms_output.put_line(''''subblock date value is ''''||v_date); 执行结果:subblock date value is 22-11月-01 ****说明:主块中的变量,如果子块中没有同名变量声明,则继承主块中的声明和初始化值; 2、在子块中加入:v_sub char(9); dbms_output.put_line(''''subblock char value is ''''||v_sub); 此时正常输出。 在主块中加入:dbms_output.put_line(''''main char value is ''''||v_sub); 输出:ORA-06550: 第 21 行, 第 45 列: PLS-00201: 必须说明标识符 ''''V_SUB'''' 说明: 子块中声明的变量主块中并不知晓,因此出错。 了解了此实例,一切情况的变量的值的走向就都明了了。
一、控制执行流 可以是分支和循环:IF THEN END IF IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE statements;] END IF; 例子:IF V_ENAME=''''OSBORNE'''' THEN V_MGR:=22; END IF; 这里我们可以注意,PLSQL和C语言或JAVA在条件上的不同,=代表关系运算,而:=代表赋值。 看一个函数: create FUNCTION calc_val (v_start IN NUMBER) RETURN NUMBER IS BEGIN IF v_start > 100 THEN RETURN (2 * v_start); ELSIF v_start >= 50 THEN RETURN (.5 * v_start); ELSE RETURN (.1 * v_start); END IF; END calc_val; 现在,虽然我们尚未讲解CREATE 函数或过程,但可以看到IF 条件在其中的作用。 二、注意LOGIC TABLE中的逻辑对应关系 1、NOT、AND、OR 2、任何表达式中含有空值结果都为 NULL 3、连接字符串中含有空值会把NULL作为 EMPTY STRING declare v_deptno dept.deptno%type; v_loc dept.loc%type; V_FLAG BOOLEAN ; V_REC BOOLEAN :=FALSE; --此值改为TRUE、NULL、FALSE进行不同的比较 V_AVA BOOLEAN:=NULL; begin V_FLAG:=V_REC AND V_AVA; IF V_FLAG=TRUE THEN DBMS_OUTPUT.PUT_LINE (''''TRUE''''); ELSIF V_FLAG=FALSE THEN DBMS_OUTPUT.PUT_LINE (''''FALSE''''); ELSE DBMS_OUTPUT.PUT_LINE (''''NULL''''); END IF; end; / 值得注意的是:NULL AND FALSE ---> FALSE 这是在实践中总结出来的。 三、基本循环基础: 1、LOOP statement1; statement2; . . . EXIT [WHEN condition]; END LOOP; v_ord_id s_item.ord_id%TYPE := 101; v_counter NUMBER (2) := 1; BEGIN . . . LOOP INSERT INTO s_item (ord_id, item_id) VALUES (v_ord_id, v_counter); v_counter := v_counter + 1; EXIT WHEN v_counter > 10; END LOOP; 2、FOR循环: FOR index IN [REVERSE] lower_bound..upper_bound LOOP statement1; statement2; . . . END LOOP;
实例:DECLARE V_LOWER NUMBER:=1; V_UPPER NUMBER:=23; BEGIN DBMS_OUTPUT.PUT_LINE(''''''''); FOR I IN V_LOWER..V_UPPER LOOP DBMS_OUTPUT.PUT_LINE(I); END LOOP; END; / 3、WHILE 循环: WHILE condition LOOP statement1; statement2; . . . END LOOP; 4、循环是可以多层嵌套的。可以用<<LABEL>>做循环的标签。 ... BEGIN <<Outer–loop>>LOOP v_counter :=v_counter+1; EXIT WHEN v_counter>10; <<Inner–loop>>LOOP ... EXIT Outer_loop WHEN total_done = ’YES’; –– Leave both loops EXIT WHEN inner_done = ’YES