首页 > 编程知识 正文

oracle cursor用法,oracle的cursor属性

时间:2023-05-05 02:56:28 阅读:213392 作者:4178

一,概念
        Oracle的游标是一个指向上下文区域的指针,这个上下文区域是PL/SQL语句块中在执行SELECT语句或DML数据操纵语句时分配的。比如当使用SELECT语句查询返回多行数据时,可以通过游标来指向结果集中的每一行,使用循环语句依次对每一行进行处理。
        个人理解游标相当于C中的指针。因为游标其实是相当于把磁盘数据整体放入了内存中,如果游标数据量大则会造成内存不足,内存不足带来的影响大家都知道了。
        所以,在数据量小时才使用游标。
二,类型
        游标分为以下两种:
        隐式游标:由PL/SQL自动为DML语句或SELECT-INTO语句分配的游标,包括只返回一条记录的查询操作。
        显式游标:在PL/SQL块的声明区域中显式定义的,用来处理返回多行记录查询的游标。
1. 隐式Cursor:
1).对于Select …INTO…语句,一次只能从数据库中获取到一条数据,对于这种类型的DML Sql语句,就是隐式Cursor。例如:Select /Update / Insert/Delete操作。
2)作用:可以通过隐式Cusor的属性来了解操作的状态和结果,从而达到流程的控制。Cursor的属性包含:
SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数
SQL%FOUND 布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功
SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反
SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
3) 隐式Cursor是系统自动打开和关闭Cursor.
下面是一个例子:

BEGINUPDATE empSET comm = comm * 1.12WHERE empno = 7389; --更新员工编号为7389的员工信息--使用隐式游标属性判断已更新的行数DBMS_OUTPUT.put_line (SQL%ROWCOUNT || '行被更新');--如果没有任何更新IF SQL%NOTFOUNDTHEN--显示未更新的信息DBMS_OUTPUT.put_line ('不能更新员工号为7389的员工!');END IF;--向数据库提交更改EXCEPTIONWHERE OTHERSTHENDBMS_OUTPUT.put_line (SQLERRM); --如果出异常,提示异常信息END;

2. 显式Cursor:
(1) 对于从数据库中提取多行数据,就需要使用显式Cursor。显式Cursor的属性包含:
游标的属性 返回值类型 意 义
%ROWCOUNT 整型 获得FETCH语句返回的数据行数
%FOUND 布尔型 最近的FETCH语句返回一行数据则为真,否则为假
%NOTFOUND 布尔型 与%FOUND属性返回值相反
%ISOPEN 布尔型 游标已经打开时值为真,否则为假

(2) 对于显式游标的运用分为四个步骤:
 定义游标—Cursor [Cursor Name] IS;
 打开游标—Open [Cursor Name];
 操作数据—Fetch [Cursor name]
 关闭游标—Close [Cursor Name],这个Step绝对不可以遗漏。

DECLARE--定义加薪比例常量c_manager CONSTANT NUMBER :=0.15;c_salesman CONSTANT NUMBER :=0.12;c_clerk CONSTANT NUMBER :=0.10;v_job VARCHAR(100);---定义职位变量v_empno VARCHAR(20); --定义员工编号变量v_ename VARCHAR(60); --定义员工名称变量CURSOR c_empISSELECT jog,empno,enameFROM scott.empFOR UPDATE;BEGINOPEN c_emp;--打开游标LOOP--循环游标FETCH c_empINTO v_job,v_empno,v_ename;--提取游标数据EXIT WHEN c_emp%NOTFOUND;--如果无数据可提取则退出游标IF v_job = 'CLERK'THEN--如果为职员,加薪10%UPDATE scott.empSET sal = sal*(1 + c_clerk)WHERE CURRENT OF c_emp;ELSIF v_job = 'SALESMAN'THEN--如果为销售职员,加薪12%UPDATE scott.empSET sal = sal*(1 +c_salesman)WHERE CURRENT OF c_emp; ELSIF v_job = 'MANAGER'THEN--如果为经理,加薪15%UPDATE scott.empSET sal = sal*(1 + c_manager)WHERE CURRENT OF c_emp;END IF;DBMS_OUTPUT.put_line ('已经为员工'|| v_empno|| ':'|| v_ename|| '成功加薪');END LOOP;CLOSE c_emp;--关闭游标EXCEPTIONWHEN NO_DATA_FOUNDTHEN--处理PL/SQL预定义异常DBMS_OUTPUT.put_line('没有找到员工数据');END;

        使用游标,我的理解是两个线程,一个专门跑循环,另一个则是游标时时去获取数据,不知道理解的对不对,望大佬解答

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。