1:游标实例,显示出姓名和部门
DECLARE
name VARCHAR2(50);
department_name varchar(20); --定义两个变量来存放employees表和departments表中的内容
CURSOR emp_cur IS --定义游标emp_cur
SELECT name, department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id; --选出所有员工的姓名和所在部门
BEGIN
OPEN emp_cur; --打开游标
LOOP
FETCH emp_cur INTO name, department_name; --每次将一行数据放入到变量中,游标后移
EXIT WHEN emp_cur%NOTFOUND; --当游标取不到数据时退出循环
dbms_output.put_line(name || ' 在 ' || department_name); --输出姓名和所在部门
END LOOP;
CLOSE emp_cur;
END;
2:第二个例子,
公司上市,决定给员工提高薪资,入职时间没超过1年涨100,1000元封顶
DECLARE
hire_date DATE; --定义2个变量存放employee表中的内容
e_id NUMBER;
CURSOR emp_cur IS --定义游标emp_cur
SELECT id, hire_date
FROM employees; --选出所有员工的姓名和入职时间
BEGIN
OPEN emp_cur; --打开游标
LOOP
FETCH emp_cur INTO e_id, hire_date; --每次将一行数据存入变量中,游标后移
EXIT WHEN emp_cur % NOTFOUND;
IF 100*(2010 - to_char(hire_date, 'yyyy')) < 1000 THEN --判断年限和工资的关系
UPDATE salary
SET salaryvalue = salaryvalue + 100*(2010 - to_char(hire_date, 'yyyy'))
WHERE employeeid = e_id;
ELSE
UPDATE salary
SET salaryvalue = salaryvalue + 1000;
WHERE employeeid = e_id;
END IF;
END LOOP;
END;
3:使用循环游标简化游标的读取
语法:
FOR IN LOOP
--操作各行数据
END LOOP;
例子:
DECLARE
TYPE employee_record IS RECORD --定义一个RECORD类型的变量,里面包含name和department_name两个变量
(
name VARCHAR2(50),
department_name varchar(20)
);
CURSOR emp_cur IS
SELECT name, department_name
FROM employee e, departments d
WHERE e.department_id = d.department_id;
BEGIN
FOR employee_record IN emp_cur LOOP
dbms_output.put_line
(employee_record.name || ' 在 ' || employee_record.department_name);
END LOOP;
END;