PL/SQL 流程控制
l 条件分支:
1) IF..THEN..END IF
用法举例:
该存储过程可以输入一个雇员名称,如果该雇员的工资小雨2000就给他加工资加10%.
代码如下:
CREATE OR REPLACE PROCEDURE sp_procedure_myemp(spname vachar12) IS
--定义
v_sal myemp.sal%type;
BEGIN
--执行
SELECT myemp.sal INTO v_sal from myemp WHERE myemp.ename=spname;
--判断
IF v_sal<2000 THEN
UPDATE myemp SET sal=sal+sal*0.1 WHERE myemp.ename=spname;
END IF;
END;
2) IF..THEN--ELSE..END IF
用法举例:
该存储过程可以输入一个雇员名称,如果该雇员的奖金如果为0,就给该雇员加200,如果不是0就加100.
代码如下:
CREATE OR REPLACE PROCEDURE sp_procedure_myemp(spname vachar12) IS
--定义
v_comm myemp.comm%type;
BEGIN
--执行
SELECT myemp.comm INTO v_comm from myemp WHERE myemp.ename=spname;
--判断
IF v_comm<>0 THEN
UPDATE myemp SET comm=comm+100 WHERE myemp.ename=spname;
ELSE
UPDATE myemp SET comm=comm+200 WHERE myemp.ename=spname;
END IF;
END;
3) IF..THEN--ELSIF..THEN--ELSE..END IF
用法举例:
该存储过程可以输入一个雇员可以输入一个雇员编号,如果该雇员的工作(Job)是"PRESIDENT"就给他的工资加1000,如果是"MANAGER"就给他的工资加500,否则就给加200.
代码如下:
CREATE OR REPLACE PROCEDURE sp_procedure_myemp(spno NUMBER) IS
--定义
v_job myemp.job%type;
BEGIN
--执行
SELECT myemp.job INTO v_job from myemp WHERE myemp.empno=spno;
--判断
IF v_job ='PRESIDENT' THEN
UPDATE myemp SET sal=sal+1000 WHERE myemp.empno=spno;
ELSIF v_job ='MANAGER' THEN
UPDATE myemp SET sal=sal+500 WHERE myemp.empno=spno;
ELSE
UPDATE myemp SET sal=sal+200 WHERE myemp.empno=spno;
END IF;
END;
l 循环语句
LOOP--END LOOP
用法举例:
编写一个存储过程可允许输入用户名,循环向USERS表中添加十条数据.
CREATE OR REPLACE PROCEDURE sp_procedure_users(uname VARCHAR2) IS
--定义
v_no NUMBER:=1;
BEGINa
--执行
LOOP
INSERT INTO users VALUES(v_no,uname);
--判断是否要退出循环
EXIT WHEN v_no=10 ;
--自增
v_no:=v_no+1;
End LOOP;
END;
WHILE--LOOP--END LOOP
用法举例
编写一个存储过程可允许输入用户名,循环向USERS表中添加十条数据,从地十一条开始.
CREATE OR REPLACE PROCEDURE sp_procedure_users(uname VARCHAR2) IS
--定义
v_no NUMBER:=11;
BEGIN
--执行
WHILE v_no<=20 LOOP
INSERT INTO users VALUES(v_no,uname);
--自增
v_no:=v_no+1;
End LOOP;
END;
注意:以上循环操作需手动创建users表,且有两个字段分别是num(NUMBER),uname(VARCHAR2(12))
FOR 循环
用法举例
该存储过程根据输入的步长循环打印。
代码如下:
CREATE OR REPLACE PROCEDURE proc_test ( v_num NUMBER ) AS
BEGIN
FOR x IN 1 .. v_num LOOP
DBMS_OUTPUT.put_line ( x );
END LOOP;
END ;