目录
1.游标的基本概念:
游标就是用来处理多条返回数据
当返回多条数据且需要逐条处理数据时候可以使用游标进行处理
2.游标的分类:显示游标和隐式游标
2.1显示游标的使用过程
--声明游标
CURSOR 【游标名】 IS SELECT 【select语句】;
-打开游标
OPEN 【游标名】;
--提取数据
FETCH cursor_name INTO variable1, variable2, ...;
--关闭游标
CLOSE emp_cursor;
举例:
/*
游标
提取emp表中deptno为30的sal
*/
DECLARE
v_sal emp.sal%TYPE; -- 声明一个变量用于存储工资
CURSOR emp_sal_cursor IS
SELECT sal FROM emp WHERE deptno = 30; -- 定义游标查询部门编号为 30 的员工工资
BEGIN
OPEN emp_sal_cursor; -- 打开游标
FETCH emp_sal_cursor INTO v_sal; -- 第一次提取数据
WHILE emp_sal_cursor%FOUND LOOP -- 检查是否有数据
DBMS_OUTPUT.PUT_LINE('工资: ' || v_sal); -- 输出工资
FETCH emp_sal_cursor INTO v_sal; -- 提取下一条数据
END LOOP;
CLOSE emp_sal_cursor; -- 关闭游标
END;
2.1.1游标中常用的属性
游标提供了一些有用的属性,用于控制和检测游标状态:
%FOUND
:如果FETCH
成功提取到数据,返回TRUE
,否则返回FALSE
。%NOTFOUND
:如果FETCH
没有提取到数据,返回TRUE
,否则返回FALSE
。%ROWCOUNT
:返回游标提取的行数。%ISOPEN
:返回TRUE
如果游标仍然是打开状态,否则返回FALSE
。
2.2隐式游标
隐式游标(Implicit Cursor) 是由 Oracle 自动创建和管理的游标,用来处理单行查询或 DML(数据操作语言,如 INSERT
、UPDATE
、DELETE
)操作。每当你执行 SELECT INTO
、INSERT
、UPDATE
或 DELETE
等操作时,Oracle 会在后台自动创建一个隐式游标,而你不需要显式地声明、打开或关闭它。
3.基于游标的for循环
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename, sal FROM emp WHERE deptno = 30; -- 查询部门编号为 30 的员工
BEGIN
-- 基于游标的 FOR 循环,自动处理游标的打开、提取和关闭
FOR emp_record IN emp_cursor LOOP
-- 输出每个员工的编号、姓名和工资
DBMS_OUTPUT.PUT_LINE('员工编号: ' || emp_record.empno ||
', 姓名: ' || emp_record.ename ||
', 工资: ' || emp_record.sal);
END LOOP;
END;
/*
1.emp_record 是一个自动生成的记录类型变量,用于在每次循环中存储从游标中提取的一行数据。
这个记录变量拥有与游标查询中返回的列相同的字段,因此在循环体内可以直接通过 emp_record 访问 empno、ename 和 sal。
*/
4.常用emp表
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
CREATE TABLE emp (
empno NUMBER(5) NOT NULL,
ename VARCHAR2(20) NOT NULL,
job VARCHAR2(9) NOT NULL,
mgr NUMBER(5),
hiredate DATE NOT NULL,
sal NUMBER(7,2) NOT NULL,
comm NUMBER(7,2),
deptno NUMBER(5) NOT NULL
);
INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00, NULL, 20);
INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1991-02-20', 1600.00, 300.00, 30);
INSERT INTO emp VALUES (7521, 'WARD', 'SALESMAN', 7698, '1991-02-22', 1250.00, 500.00, 30);
INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER', 7839, '1991-04-02', 2975.00, NULL, 20);
INSERT INTO emp VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1991-09-28', 1250.00, 1400.00, 30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1991-05-01', 2850.00, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER', 7839, '1991-06-09', 2450.00, NULL, 10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1997-04-19', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT', NULL, '1991-11-17', 5000.00, NULL, 10);
INSERT INTO emp VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1991-09-08', 1500.00, NULL, 30);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK', 7698, '1991-12-03', 950.00, NULL, 30);
INSERT INTO emp VALUES (7902, 'FORD', 'ANALYST', 7566, '1991-12-03', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7934, 'MILLER', 'CLERK', 7782, '1992-01-23', 1300.00, NULL, 10);
SELECT * FROM emp;