E;
v_sal EMP.sal%TYPE;
BEGIN
--执行
--把test_cursor和一个SELECT结合
OPEN test_cursor FOR SELECT ename,sal FROM EMP WHERE deptno=&no;
--循环取出
LOOP
FETCH test_cursor INTO v_ename,v_sal;
--判断工资高低,决定是否更新
--判断是否test_cursor是否为空
EXIT WHEN test_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('雇员名是:'||v_ename||',薪水'||v_sal);
END LOOP;
END;
/
--编写一个过程,输入雇员名,工资低于2000的雇员工资增加10%
CREATE OR REPLACE PROCEDURE fj_pro6(fjname VARCHAR2) IS
--定义
v_sal EMP.sal%TYPE;
BEGIN
--执行
SELECT sal INTO v_sal FROM EMP WHERE ename=fjname;
--判断
IF v_sal<2000 THEN
UPDATE EMP SET sal=sal*1.1 WHERE ename=fjname;
END IF;
END;
/
--调用
EXEC fj_pro6('SCOTT');
--雇员如果补助为零则加200,如果不为零则加100
CREATE OR REPLACE PROCEDURE fj_pro7(fjname VARCHAR2) IS
--定义
v_comm EMP.comm%TYPE;
BEGIN
--执行
SELECT comm INTO v_comm FROM EMP WHERE ename=fjname;
--判断
IF v_comm<>0 THEN
UPDATE EMP SET comm=comm+100 WHERE ename=fjname;
ELSE
UPDATE EMP SET comm=comm+200 WHERE ename=fjname;
END IF;
END;
/
--调用
EXEC fj_pro7('SCOTT');
--三个条件分支 IF-THEN-ELSEIF-ELSE
--输入雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200。
CREATE OR REPLACE PROCEDURE fj_pro8(fjno NUMBER) IS
--定义
v_job EMP.job%TYPE;
BEGIN
--执行
SELECT job INTO v_job FROM EMP WHERE EMPno=fjno;
IF v_job='PRESIDENT' THEN
UPDATE EMP SET sal=sal+1000 WHERE EMPno=fjno;
ELSIF v_job='MANAGER' THEN
UPDATE EMP SET sal=sal+500 WHERE EMPno=fjno;
ELSE
UPDATE EMP SET sal=sal+200 WHERE EMPno=fjno;
END IF;
END;
/
--调用
EXEC fj_pro8(7839);
--循环语句 LOOP
--users表中,用户编号从1开始增加
CREATE TABLE users(
userno NUMBER,
username VARCHAR2(40)
);
CREATE OR REPLACE PROCEDURE fj_pro9(fjname VARCHAR2) IS
--定义:=表示赋值
v_num NUMBER:=1;
BEGIN
LOOP
INSERT INTO users VALUES(v_num,fjname);
--判断退出条件
EXIT WHEN v_num=10;
--自增
v_num:=v_num+1;
END LOOP;
END;
/
--调用
EXEC fj_pro9('root1');
--这样表中会有十个username为root1的元组
CREATE OR REPLACE PROCEDURE fj_pro10(fjname VARCHAR2) IS
--定义:=表示赋值
v_num NUMBER:=11;
BEGIN
WHILE v_num<=20 LOOP
INSERT INTO users VALUES(v_num,fjname);
v_num:=v_num+1;
END LOOP;
END;
/
--调用
EXEC fj_pro10('root1');
|