PLSQL编程语言的使用与程序设计 下载本文

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.