--简单的条件判断if–then --编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。 create or replace procedure sp_pro6 ( spname varchar2 )is --定义 v_sal emp.sal%type; begin --执行 select sal into v_sal from emp where ename=spname; --判断 if v_sal<2000 then update emp set sal=sal+sal*0.1 where ename=spname; end if; commit; end; --调用存储过程 exec SP_PRO6('ALLEN'); ======================================================== --二重条件分支 if–then–else --编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200; create or replace procedure sp_pro6 ( spname varchar2 )is v_comm emp.comm%type; begin select comm into v_comm from emp where ename=spname; if v_comm<>0 then update emp set comm=comm+100 where ename=spname; else update emp set comm=comm+200 where ename=spname; end if; commit; end; ====================================================== --多重条件分支 if–then–ELSIF–then --编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER 就给他的工资增加500,其它职位的雇员工资增加200 CREATE OR REPLACE PROCEDURE SP_PRO6(SPNO NUMBER) IS --定义 V_JOB EMP.JOB%TYPE; BEGIN --执行 SELECT JOB INTO V_JOB FROM EMP WHERE EMPNO = SPNO; IF V_JOB = 'PRESIDENT' THEN UPDATE EMP SET SAL = SAL + 1000 WHERE EMPNO = SPNO; ELSIF V_JOB = 'MANAGER' THEN UPDATE EMP SET SAL = SAL + 500 WHERE EMPNO = SPNO; ELSE UPDATE EMP SET SAL = SAL + 200 WHERE EMPNO = SPNO; END IF; COMMIT; END; ======================================================== --循环语句–loop create table users ( vid number(5), uname varchar2(30) ); select * from users; --写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加。 create or replace procedure sp_pro6 ( spname varchar2 )is --定义 :=表示赋值 v_num number:=1; begin loop insert into users values(v_num,spname); --判断是否要退出循环 exit when v_num=10; --自增 v_num:=v_num+1; end loop; commit; end; ===================================================== --循环语句–while循环 --对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以while...loop开始,以end loop 结束。 --编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。 CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS --定义 :=表示赋值 V_NUM NUMBER := 11; BEGIN WHILE V_NUM <= 20 LOOP --执行 INSERT INTO USERS VALUES (V_NUM, SPNAME); V_NUM := V_NUM + 1; END LOOP; COMMIT; END; ====================================================== --循环语句–for循环 CREATE OR REPLACE PROCEDURE SP_PRO6 IS--注意如果无参记得不要加() BEGIN FOR I IN REVERSE 1 .. 10 LOOP --REVERSE反转函数,表示I从10到1递减,去掉REVERSE表示I从1到10递增 INSERT INTO USERS VALUES (I, 'shunping'); END LOOP; END; =============================================== --goto语句 --goto语句用于跳转到特定符号去执行语句。注意由于使用goto语句会增加程序的复杂性,并使得应用程序可读性变差,所以在做一般应用开发时,建议大家不要使用goto语句。 --基本语法如下goto lable,其中lable是已经定义好的标号名 DECLARE I INT := 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE('输出i=' || I); IF I = 1 THEN GOTO END_LOOP; END IF; I := I + 1; END LOOP; <<END_LOOP>> DBMS_OUTPUT.PUT_LINE('循环结束'); END; =============================================== --null语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高pl/sql的可读性。 DECLARE V_SAL EMP.SAL%TYPE; V_ENAME EMP.ENAME%TYPE; BEGIN SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM EMP WHERE EMPNO = &NO; IF V_SAL < 3000 THEN UPDATE EMP SET COMM = SAL * 0.1 WHERE ENAME = V_ENAME; dbms_output.put_line('1111'); ELSE NULL; dbms_output.put_line('2222');--不会被执行 END IF; END;