DECLARE
?
?v_sal NUMBER(6,2);
?
BEGIN
?
?SELECT sal INTO v_sal FROM emp WHERE lower(ename)=lower('&&name');
?
IF v_sal<2000 THEN
?
?UPDATE emp SET sal=v_sal+200 WHERE lower(ename)=lower('&name');
?
END IF;
?
END;
?
1.2 二重条件分支
DECLARE
?
?v_comm NUMBER(6,2);
?
BEGIN
?
?SELECT comm INTO v_comm FROM emp WHERE empno=&no;
?
?IF v_comm<>0 THEN
?
? UPDATE emp SET comm=v_comm+100 WHERE empno=&no;
?
?ELSE
?
? UPDATE emp SET comm=200 WHERE empno=&no;
?
?END IF;
?
END;
?
1.3 多重条件分支
DECLARE
?
?v_job VARCHAR2(10);
?
?V_sal NUMBER(6,2);
?
BEGIN
?
?SELECT job,sal INTO v_job,v_sal FROM emp WHERE empno=&no;
?
?IF v_job='PRESIDENT' THEN
?
? UPDATE emp SET sal =v_sal+1000 WHERE empno=&no;
?
?ELSEIF?
?
? v_job='MANAGER' THEN
?
? UPDATE emp SET sal=v_sal+500 WHERE empno=&no;
?
?ELSE
?
? UPDATE emp SET sal=v_sal+200 WHERE empno=&no;
?
?END IF;
?
END;
?
2、CASE条件选择语句
2.1 使用单一选择符进行等值比较
DECLARE
?
?v_deptno emp.deptno%TYPE;
?
BEGIN
?
?v_deptno:=&no;
?
CASE v_deptno
?
?WHEN 10 THEN
?
? UPDATE emp SET comm=100 WHERE deptno=v_deptno;
?
?WHEN 20 THEN
?
? UPDATE emp SET comm=80 WHERE deptno=v_deptno;
?
?WHEN 30 THEN
?
? UPDATE emp SET comm=30 WHERE deptno=v_deptno;
?
?ELSE
?
? DBMS_OUTPUT.PUT_LINE('不存在该部门');
?
END CASE;
?
END;
?备注:ELSE后为不满足条件时默认处理结果。
2.2 在CASE语句中使用多种条件比较
?当使用单一条件选择符进行等值比较时,可以使用CASE xxx 语法来实现,如果包含有多种条件进行不等比较,那么必须在WHEN子句中指定比较条件。
DECLARE
?
?v_sal emp.sal%TYPE;
?
?v_ename emp.ename%TYPE;
?
BEGIN
?
?SELECT sal ,ename INTO v_sal,v_ename FROM emp WHERE empno=&no;
?
CASE
?
?WHEN v_sal<1000 THEN
?
? UPDATE emp SET comm=100 WHERE ename=v_ename;
?
?WHEN v_sal<2000 THEN
?
? UPDATE emp SET comm=80 WHERE ename=v_ename;
?
?WHEN v_sal<6000 THEN
?
? UPDATE emp SET comm=50 WHERE ename=v_ename;
?
END CASE;
?
END;
?
3、LOOP循环
?DECLARE
?
?i NUMBER(10):=1;
?
BEGIN
?
?LOOP
?
? DBMS_OUTPUT.PUT_LINE(i);?
?
? i:=i+1;
?
? EXIT WHEN i=10;
?
?END LOOP;
?
END;
备注:必须使用WHEN子句有条件退出循环。
?
4、WHILE循环
?基本循环至少执行一次循环体内的语句,而对于WHILE循环来说,只有条件为TRUE才会执行循环体内的语句。以WHILE..LOOP 开始 END LOOP结束。
DECLARE
?
?i NUMBER(10):=1;
?
BEGIN
?
?WHILE i<=10 LOOP
?
? DBMS_OUTPUT.PUT_LINE(i);
?
? i:=i+1;
?
?END LOOP;
?
END;
?
5、FOR循环
BEGIN
?
?FOR i IN 1..10 LOOP
?
? DBMS_OUTPUT.PUT_LINE(i);
?
?END LOOP;
?
END;
?
?
BEGIN
?
?FOR i IN REVERSE 1..10 LOOP
?
? DBMS_OUTPUT.PUT_LINE(i);
?
?END LOOP;
?
END;
备注:关键字REVERSE表示逆向,即从最大值向下递减。FOR循环可以嵌套。
?
?6、GOTO语句
? ? 无条件跳转到一个标签处。eg:goto 标签名称;
? ? 备注:Oracle标签定义为:<<标签名称>>
? ? ? ? ? ? ? ? Oracle使用两个单引号表示转义含义,eg:'''表示一个单引号。
? ? ? ? ? ? ? ? GOTO语句对系统性能影响很大,建议尽量少用。
?
7、NULL语句
? ? 什么都不做,只是将控制权交给下一个语句。