Oracle CURSOR的使用方法

前言:
 Oracle的对表操作中有一种类似于DataSet的对象操作方法CURSOR,它可以通过建立表的操作对象或者说表的指针对象来达到从表里面提取数据的操作。
说明:
 一般通过SQL语言可以针对某个表的某一行或多行数据进行操作比如说SELECT,UPDATE等。这些操作必须以SQL语句的语法格式来被解释器解释并执行。在实际变成中经常用到,特别是用编程语言来对数据库操作时更是必不可少。当然数据库也不是不能自己来做一些处理的,简单的数据操作的话,像ORACLE这样的数据库可以用自身的PL/SQL语言来实现。不仅执行速度快,而且节省网络。因为它是直接在数据库端执行的。
 CURSOR就是PL/SQL中的一种实现对表的对象化操作方法。
 他一共分为两种:
 显式型
 解释:顾名思义,就是在程序书写过程中利用创建表对象的过程中,明确的使用变量名。
 暗式型
 解释:不是用变量名,而用简单的语法来完成对象的操作。ORACLE里面已经定义好了,只需要调用就可以使用。

关于PL/SQL的书写格式,这里省略。
显式型的CURSOR在定义过程中必须写在定义区间
也就是说需要写在 IS  ..... BEGIN  或者  DECLARE .... BEGIN。
而执行的时候就要写在 BEGIN.....END了。

看不明白的话,就看例子了。

CREATE OR REPLACE PROCEDURE AAA
IS
CURSOR BBB IS
SELECT CCC FROM TABLE ;
vBBB BBB%ROWTYPE;
BEGIN
OPEN BBB;
LOOP
FETCH BBB INTO vBBB;
EXIT WHEN BBB%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vBBB);
END LOOP;
CLOSE BBB
;
END;
/

 首相创建了一个PROCEDURE名字为AAA,然后在定义区间里面定义了一个CURSOR名字为BBB,
连接表TABLE并从中读取列CCC。之后定义了一个行类型的变量用于存储每一行的数据。
 到此,表的对象以及读取数据的条件还有数据存储用的变量就都定义好了。
 然后OPEN这个表对象,进入循环。每循环一次指针便会自动向后移动,将BBB里面的数据以行为单位读出存入vBBB。然后当BBB的指针到最后也就是说数据读到最后没有了的时候便退出循环并且关闭BBB。
DBMS_OUTPUT.PUT_LINE是用来在屏幕上打印vBBB用的。

 与之相同 OPEN  FETCH CLOSE 的语法格式看来挺麻烦的。这样的话就用FOR来代替也可以

BEGIN
FOR vBBB IN BBB;
LOOP
DBMS_OUTPUT.PUT_LINE(vBBB);
END LOOP;
END;

 这就省事多了。意思也一目了然。因为SURSOR定义了变来名字,用几次也OK。
 暗式型呢?

BEGIN
FOR vBBB IN (SELECT CCC FROM TABLE)
LOOP
DBMS_OUTPUT.PUT_LINE(vBBB)
;
END LOOP;
END;

 这届这样写就行了,但是每次都要从写。脱离了这个循环就没办法使用了。
 因为程序用的都是大写字母,看起来怪怪的。

Oracle 中的 Cursor(游标)是一个数据库对象,用于处理 SQL 查询返回的结果集。通过游标,可以逐行访问查询结果并对其进行操作。以下是关于 Oracle 游标的详细介绍: ### 什么是 Oracle Cursor? 在 PL/SQL 程序中,Cursor 提供了一种机制来迭代和管理从数据库表中检索的数据。每个游标都与一条 SELECT 查询语句相关联,并允许程序对每条记录进行单独的操作。 #### 类型 1. **显式游标** 显式游标是由程序员手动声明、打开、获取数据以及关闭的对象。 ```sql DECLARE CURSOR cur_employee IS SELECT employee_id FROM employees; emp_id NUMBER; BEGIN OPEN cur_employee; -- 打开游标 LOOP FETCH cur_employee INTO emp_id; -- 获取下一行数据 EXIT WHEN cur_employee%NOTFOUND; -- 当没有更多行时退出循环 DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_id); END LOOP; CLOSE cur_employee; -- 关闭游标 END; ``` 2. **隐式游标** 隐式游标由 Oracle 自动创建,适用于简单的 DML 操作(如 INSERT、UPDATE 和 DELETE),不需要额外的手动控制。 - `SQL%ROWCOUNT` 可以检查受影响的行数。 - 示例: ```sql UPDATE employees SET salary = salary * 1.1 WHERE department_id = 50; IF SQL%ROWCOUNT > 0 THEN DBMS_OUTPUT.PUT_LINE('Rows updated successfully.'); ELSE DBMS_OUTPUT.PUT_LINE('No rows were affected.'); END IF; ``` #### 主要属性 - `%ISOPEN`: 判断游标是否已经打开。 - `%FOUND`: 如果上一次 `FETCH` 成功,则为 TRUE;如果未找到任何行则为 FALSE。 - `%NOTFOUND`: 上次 `FETCH` 是否失败。 - `%ROWCOUNT`: 返回已提取或影响到的行数。 --- ### 使用场景 当你需要逐一处理大量数据而不是一次性加载所有内容时,可以使用游标。例如批量更新某些特定条件下的员工信息等任务非常适合采用这种方法完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值