End loop; -- 第三部分:关键字End loop结束循环 …
LOOP-EXIT WHEN-END循环:
除退出条件检测有所区别外,此结构与前一个循环结构类似。 cnt:=1; --在循环开始前,初始化循环计数器
loop --第一部分:以循环关键字loop开始循环 cnt:=cnt+1; --第二部分:增加循环计数器的值 exit when cnt>=100 -- 测试cnt是否符合退出条件 …
End loop; -- 第三部分:关键字End loop结束循环 …
WHILE-LOOP-END循环:
此结构在循环的while部分测试退出条件。 cnt:=1; --在循环开始前,初始化循环计数器
while cnt < 100 loop --第一部分:在每次执行循环前,while都要检查退出条件 … --第二部分:循环体内部的可执行代码 cnt:=cnt+1; --增加循环计数器的值以满足退出条件 …
End loop; --第三部分:关键字End loop结束循环 …
FOR-IN-LOOP-END循环:
最后介绍的这种循环结构重复执行预定义次数的循环。该循环结构也由三部分组成: for in部分定义跟踪循环的变量;
执行循环体中的一条或多条语句,直至控制循环的变量满足退出条件为止; end loop部分结束循环。
下面是一个说明如何使用这种循环机制的例子: for cnt in 1..3 loop insert into tabl values(‘Still in loop’,cnt); end loop; 例:
1.在SQL*Plus中使用PL/SQL块处理
EMP表中职工号7788的职工,如果工资小于3000那么把工资更改为3000: SQL>DECLARE x NUMBER(7,2); BEGIN
SELECT sal INTO x FROM emp WHERE empno = 7788;
IF x < 3000 THEN
UPDATE emp SET sal = 3000 WHERE empno = 7788; END IF; END;
注:PL/SQL块在SQL*Plus中以点号(.)结束。
如果想运行缓冲区的内容,那么可以用RUN命令或者/命令。 2.无参数的存储过程
首先创建表:
SQL> create table log_table( 2 user_id varchar2(10), 3 log_date varchar2(12));
CREATE OR REPLACE PROCEDURE log_execution IS
BEGIN
INSERT INTO log_table (user_id,log_date) VALUES (user,sysdate); END; /
存储过程的在SQL*Plus中运行 SQL>EXECUTE log_execution;
3.带输入参数的存储过程
解雇给定职工号的职工,并调用log_execution: SQL> CREATE OR REPLACE PROCEDURE fire_emp
2 (v_emp_no IN emp.empno%type) 3 IS
4 BEGIN
5 Log_execution;
6 DELETE FROM EMP WHERE empno = v_emp_no; 7 END; 8 /
SQL>EXECUTE fire_emp(7654);
存储过程删除了职工号7654的职工。
4.带输入输出的存储过程
查询EMP中给定职工号的姓名、工资和佣金。
SQL> CREATE OR REPLACE PROCEDURE query_emp 2 (v_emp_no IN emp.empno%type, 3 v_emp_name OUT emp.ename%type, 4 v_emp_sal OUT emp.sal%type, 5 v_emp_comm OUT emp.comm%type) 6 IS
7 BEGIN
8 SELECT ename,sal,comm
9 INTO v_emp_name,v_emp_sal,v_emp_comm 10 FROM EMP WHERE empno = v_emp_no; 11 END; 12 /
调用:
SQL>VAR emp_name varchar2(15); SQL>VAR emp_sal number; SQL>VAR emp_comm number;
SQL>EXECUTE query_emp(7566,:emp_name, :emp_sal, :emp_comm); PL/SQL procedure successfully completed. SQL>PRINT emp_name EMP_NAME ------------------- JONES
或者用以下语句调用: DECLARE
emp_name varchar2(15); emp_sal number; emp_comm number; BEGIN
query_emp(7566,emp_name, emp_sal, emp_comm);
DBMS_OUTPUT.PUT_LINE(emp_name||' '|| emp_sal||' '||emp_comm); END;
5.用Function查询出EMP中给定职工号的工资 SQL> CREATE OR REPLACE FUNCTION get_sal
2 (v_emp_no IN emp.empno%type) 3 RETURN number 4 AS
5 V_emp_sal emp.sal%type:= 0; 6 BEGIN
7 SELECT sal INTO v_emp_sal
8 FROM EMP WHERE empno = v_emp_no; 9 RETURN (v_emp_sal); 10 END; 11 /
SQL>VARIABLE emp_sal number;
SQL>EXECUTE :emp_sal := get_sal(7566); PL/SQL procedure successfully completed. SQL>PRINT emp_sal; EMP_SAL ------------------- 2975
【实验内容】
1、 查询名为“SMITH”的员工信息,输出其员工号、工资、部门号。如果该员工不存在,
则插入一条新记录,员工号为2007,员工名为“SMITH”,工资为1500,部门号为10.
2、 创建一个存储过程,以员工号为参数,输出该员工的工资。
3、 创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,
则工资增加150;若属于20号部门,则工资增加200;若属于30号部门,则工资增加250;若属于其他部门,则工资增加300.