plsql游标

目录

1.游标的基本概念:

2.游标的分类:显示游标和隐式游标

2.1显示游标的使用过程

2.1.1游标中常用的属性

2.2隐式游标

3.基于游标的for循环

4.常用emp表


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(数据操作语言,如 INSERTUPDATEDELETE)操作。每当你执行 SELECT INTOINSERTUPDATEDELETE 等操作时,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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值