游标

来源:互联网 发布:icmo是tcp的哪个端口 编辑:程序博客网 时间:2024/06/05 07:46

定义游标:CURSOR cursor_name IS select_statement;

1.定义游标时不用包含INTO子句。2.如果处理数据时要按照一定的顺序,就需要在定义中的SELECT语句中使用ORDER BY子句。


打开游标: OPEN cursor_name;

1.打开游标时,数据库会运行相应的SELECT语句,并将结果集放在相应的程序区中。

2.如果SELECT语句没有检索到复合条件的行,也不会引发任何异常。

3.使用游标的属性来测试取数据后游标的相关信息。


从游标中去数据:

FETCH cursor_name INTO [variable1,....];

1.将当前行提取到输出变量中。

2.输出变量与游标中的SELECT列必须匹配数据和数据类型。

3.测试游标是否包含数据。


关闭游标:1.数据处理完成后要关闭游标。

2.如果需要,可以重新打开游标。

3.游标被关闭以后就不能再从该游标中提取数据。


显式游标的属性:

%ISOPEN 打开游标时为TRUE,否则为FALSE

%NOTFOUND 最近没有取到数据时为TRUE,否则为FALSE。

%FOUDN 最近取到数据时为TRUE,否则为FALSE,与%NOTFOUND的值相反。

%ROWCOUNT到当前位置总共从游标中取到的行数。


游标FOR循环例子:

DECLARE

CURSOR c1 IS 

SELECT emno, emname

FROM em;

BEGIN

FOR em_r IN c1 LOOP

if em_r.emno = xxxx THEN

END LOOP;

END;


带参数的游标:

CURSOR cursor_name

[(parameter_name datatype,...)]

IS

select_statement;

例子:

DECLARE

CURSOR c1

(v_no number, v_job VARCHAR2) IS

SELECT emno, emname

FROM em

BEGIN

OPEN c1(10, 'click');

...


FOR UPDATE子句:

DECLARE

CURSOR c1 IS

SELECT emno, ename

FROM em

FOR UPDATE NOWAIT;


WHERE CURRENT OF 子句:WHERE CURRENT OF cursor

1.使用游标修改或删除当前正在处理的行。

2.使用FOR UPDATE子句在打开游标的查询语句中先锁定查询到的数据。

3.使用WHERE CURRENT OF子句来引用当前处理的游标中的数据行。

例子:

DECLARE

CURSOR c1 IS

SELECT ...

FOR UPDATE NOWAIT;

BEGIN

..

FOR em_r IN c1 LOOP

UPDATE...

WHERE CURRENT OF c1;

...

END LOOP;

COMMIT;

END;


带子查询的游标:

DECLARE

CURSOR my_c IS

SELECT t1.depno, dname, STAFF

FROM dep t1, (SELECT depno,

count(*) STAFF

FROM em

GROUP BY depno) t2

WHERE t1.depno = t2.depno

AND STAFF >= 5;

0 0