Oracle 游标属性


PL/SQL 会为程序中执行的每一条UPDATE,DELETE,INSERT 语句使用一个隐式游标。隐式游标有SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性,这些属性用于控制程序流程或者了解程序的状态。

当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。隐式游标只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性。SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。

1. SQL%FOUND和SQL%NOTFOUND
  在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:
a. TRUE :INSERT
b. TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.
c. TRUE :SELECT INTO至少返回一行

当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。

2. SQL%ROWCOUNT
在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.

3. SQL%ISOPEN
SQL%ISOPEN是一个布尔值,如果游标打开,则为TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。

例子:
Name Null? Type
----------------------------------------------------------------

ID NOT NULL NUMBER(9)
SALARY NUMBER(7,2)
SUBJECT_ID NOT NULL NUMBER(3)
SUBJECT_DESCRIPTION VARCHAR2(2)
BEGIN
UPDATE teacher
SET salary = salary * 1.05
WHERE subject_id IN (101, 102, 103);
IF SQL%NOTFOUND = TRUE THEN
dbms_output.put_line(TO_CHAR(SQL%ROWCOUNT));
END IF;
END;



主要内容:

  • 使用显式游标以及游标属性
  • 使用参数游标;
  • 使用显式游标更新或删除数据;
  • 使用游标FOR循环;
  • 使用游标变量
  • 使用FETCH..BULK COLLECT INTO语句和CURSOR表达式

 

1.使用显示游标

为了处理SELECT语句返回的多行数据,开发人员可以使用显式游标

使用显式游标包括定义游标、打开游标,提取数据和关闭游标。

2.显式游标属性

%ISOPEN 确定游标是否已经打开

%FOUND 检查是否从结果集中提取到了数据

%NOTFOUND 如果没有数据提取了,就返回TRUE

%ROWCOUNT 用于返回到当前行为止已经提取到的实际行数

 

3.显式游标使用示例

示例①

DECLARE

CURSOR emp_cursor IS

SELECT ename,sal FROM emp WHERE deptno=10;

v_ename emp.ename%TYPE;

v_sal emp,sal%TYPE;

BEGIN

OPEN emp_cursor;

LOOP

FETCH emp_cursor INTO v_ename,v_sal;

EXIT WHEN emp_cursor%NOTFOUND;

dbms_output.put_line(v_ename||v_sal);

END LOOP;

CLOSE emp_cursor;

END;

 

②在显式游标中,使用FETCH...BULK COLLECT INTO语句提取所有数据

DECLARE

CURSOR emp_cursor IS

SELECT ename FROM emp WHERE deptno=10;

TYPE ename_table_type IS TABLE OF VARCHAR2(10);

ename_table ename_table_type;

BEGIN

OPEN emp_cursor;

FETCH emp_cursor BULK COLLECT INTO ename_table;

FOR i IN 1..ename_table.COUNT LOOP

dbms_output.put_line(ename_table(i));

END LOOP;

CLOSE emp_cursor;

END;

/

 

③在显式游标中使用FETCH ..BULK COLLECT INTO..LIMIT语句提取部分数据

下面以每次提取5行数据为例,说明使用LIMIT子句限制提取行的方法

DECLARE

TYPE name_array_type IS VARRAY(5) OF VARCHAR2(10);

name_array name_array_type;

CURSOR emp_cursor IS SELECT ename FROM emp;

rows INT:=5;

v_count INT:=0;

BEGIN

OPEN emp_cursor;

LOOP

FETCH emp_cursor BULK COLLECT INTO name_array

LIMIT rows;

dbms_output.put('雇员名');

FOR i IN 1..(emp_cursor%ROWCOUNT-v_count) LOOP

dbms_output.put_line(name_array(i)||' ');

END LOOP;

dbms_output.put_line;//换行

v_count:=emp_cursor%ROWCOUNT;

EXIT WHEN emp_cursor%NOTFOUND;

END LOOP;

END;

/

 

④使用游标属性

DECLARE

CURSOR emp_cursor IS

SELECT ename FROM emp WHERE deptno=10;

TYPE ename_table_type IS TABLE OF VARCHAR2(10);

ename_table ename_table_type;

BEGIN

IF NOT emp_cursor%ISOPEN THEN --如果游标未打开,则打开游标

OPEN emp_cursor;

END IF;

FETCH emp_cursor BULK COLLECT INTO ename_table;

dbms_output.put_line('提取的总行数:'||emp_cursor%ROWCOUNT);--显示总计行数

CLOSE emp_cursor;

END;

/

 

⑤基于游标定义记录变量

使用%ROWTYPE属性不仅可以基于表和视图定义记录变量,也可以基于游标定义记录变量。

当基于游标定义记录变量时,记录成员名实际就是SELECT语句的列名或列别名。为了简化显式游标的数据处理,建议开发人员使用记录变量存放游标数据。

DECLARE

CURSOR emp_cursor IS SELECT ename,sal FROM emp;

emp_record emp_cursor%ROWTYPE;

BEGIN

OPEN emp_cursor;

LOOP

FETCH emp_cursor INTO emp_record;

EXIT WHEN emp_cursor%NOTFOUND;

dbms_output.put_line('雇员名'||emp_record.ename||'雇员工资'||emp_record.sal);

END LOOP;

CLOSE emp_cursor;

END;

/

 



转自   http://blog.csdn.net/yinghuashihun/article/details/6859537


http://cache.baidu.com/c?m=9d78d513d9d437ae4f9ce3697d15c0116a4381132ba6a3020bd2843e91732d475321a3e52878564291d27d141cb21902b7a5217240427bebc8df883d8ce6cd3f2fff76686d5d9b114c8e4cb8cc3220c22a925eebad19e5b9f23191a9d193c8542490155a24&p=8d759a46d6c202ee0be2977e4b0ec93b&user=baidu&fm=sc&query=%D3%CE%B1%EA%CA%F4%D0%D4&qid=d274fe9a06448ae1&p1=3





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值