PLSQL中显示游标使用的4个步骤
2012-06-20 15:31
225 查看
本例简单介绍一下游标处理的4个过程中涉及到的加锁,一致性读的问题.
显式游标处理需四个 PL/SQL步骤:
1 定义/声明游标:就是定义一个游标名,以及与其相对应的SELECT 语句。
格式:
parameter_name [IN] datatype [{:= | DEFAULT} expression]
在指定数据类型时,不能使用长度约束。如NUMBER(4),CHAR(10) 等都是错误的。
[RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与select_statement中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。
2 打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。
格式:
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
在向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。PL/SQL 程序不能用OPEN 语句重复打开一个游标。
3 提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中。
格式:
FETCH cursor_name INTO {variable_list | record_variable };
执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE。所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。
4关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN 语句重新打开。
格式:
CLOSE cursor_name;
下面用一个例子来说明:
加锁发生,如在本例中,OPEN c_cursor后,通过debug的方式停止在'--afater open',通过
select * from v$lock where sid in (select distinct sid from v$session where username='PLSQL')可以看到有加锁的记录,本例是以PLSQL用户登录的.在fetch的过程中,Oracle会保证一致性读,可以通过将For update去掉,在fetch的过程中在另外一个session中更新并提交数据来观察.大家可以参考我的另外一篇blog http://blog.csdn.net/kkdelta/article/details/7183981模拟了这个过程.close cursor并不会释放for update获得的锁,事务结束才释放.
另外,最先我是想用DBMS_OUTPUT.PUT_LINE和DBMS_LOCK.SLEEP配合来观察加锁和释放锁的现象,结果是DBMS_OUTPUT.PUT_LINE要在整个存储过程执行完之后才会输出,后来只好在PL/SQL Developer中通过debug的方式观察,大家要注意了.
在sqlplus中使用游标可以用以下方式:
variable c refcursor;
exec open :c for SELECT ISBN, TITLE FROM BOOKS WHERE rownum < 5 FOR UPDATE;
print c;
rollback;
同样exec open 的时候会加锁,最后需要显示结束事务才能释放锁.
PLSQL中还有一个称为游标变量的概念,与游标不同的是,游标变量是动态的,而游标是静态的。游标只能与指定的查询相连,即固定指向一个查询的内存处理区域,而游标变量则可与不同的查询语句相连,它可以指向不同查询语句的内存处理区域(但不能同时指向多个内存处理区域,在某一时刻只能与一个查询语句相连).
声明一个游标变量的需要注意的步骤:
1:定义一个REF CURSOU数据类型,如:
TYPE ref_cursor_type IS REF CURSOR;
2:声明一个该数据类型的游标变量,如:
cv_ref REF_CURSOR_TYPE;
3,在打开的时候和一个SQL语句关联:
OPEN cursor_variable_name
FOR select_statement;
后面这和游标的使用相同了,如下例:
显式游标处理需四个 PL/SQL步骤:
1 定义/声明游标:就是定义一个游标名,以及与其相对应的SELECT 语句。
格式:
CURSOR cursor_name[(parameter[, parameter]…)] [RETURN datatype] IS select_statement;游标参数只能为输入参数,其格式为:
parameter_name [IN] datatype [{:= | DEFAULT} expression]
在指定数据类型时,不能使用长度约束。如NUMBER(4),CHAR(10) 等都是错误的。
[RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与select_statement中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。
2 打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。
格式:
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
在向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。PL/SQL 程序不能用OPEN 语句重复打开一个游标。
3 提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中。
格式:
FETCH cursor_name INTO {variable_list | record_variable };
执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE。所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。
4关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN 语句重新打开。
格式:
CLOSE cursor_name;
下面用一个例子来说明:
CREATE OR REPLACE PROCEDURE testcur IS CURSOR c_cursor(r_no NUMBER DEFAULT 5)IS SELECT ISBN, TITLE FROM BOOKS WHERE rownum < r_no FOR UPDATE; v_isbn BOOKS.ISBN%TYPE; v_title BOOKS.TITLE%TYPE; BEGIN --OPEN c_cursor(5); OPEN c_cursor(r_no=>7); DBMS_OUTPUT.PUT_LINE('opened cursor'); --afater open --DBMS_LOCK.SLEEP(30); FETCH c_cursor INTO v_isbn, v_title; DBMS_OUTPUT.PUT_LINE('fetched cursor'); --DBMS_LOCK.SLEEP(30); WHILE c_cursor%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_isbn || '---' || to_char(v_title)); FETCH c_cursor INTO v_isbn, v_title; END LOOP; CLOSE c_cursor; DBMS_OUTPUT.PUT_LINE('closed cursor'); ROLLBACK; DBMS_OUTPUT.PUT_LINE('ended transaction'); END testcur;定义/声明游标的时候只是把SQL与游标关联,在open的时候才和表发生查询关系,如果有for update会有
加锁发生,如在本例中,OPEN c_cursor后,通过debug的方式停止在'--afater open',通过
select * from v$lock where sid in (select distinct sid from v$session where username='PLSQL')可以看到有加锁的记录,本例是以PLSQL用户登录的.在fetch的过程中,Oracle会保证一致性读,可以通过将For update去掉,在fetch的过程中在另外一个session中更新并提交数据来观察.大家可以参考我的另外一篇blog http://blog.csdn.net/kkdelta/article/details/7183981模拟了这个过程.close cursor并不会释放for update获得的锁,事务结束才释放.
另外,最先我是想用DBMS_OUTPUT.PUT_LINE和DBMS_LOCK.SLEEP配合来观察加锁和释放锁的现象,结果是DBMS_OUTPUT.PUT_LINE要在整个存储过程执行完之后才会输出,后来只好在PL/SQL Developer中通过debug的方式观察,大家要注意了.
在sqlplus中使用游标可以用以下方式:
variable c refcursor;
exec open :c for SELECT ISBN, TITLE FROM BOOKS WHERE rownum < 5 FOR UPDATE;
print c;
rollback;
同样exec open 的时候会加锁,最后需要显示结束事务才能释放锁.
PLSQL中还有一个称为游标变量的概念,与游标不同的是,游标变量是动态的,而游标是静态的。游标只能与指定的查询相连,即固定指向一个查询的内存处理区域,而游标变量则可与不同的查询语句相连,它可以指向不同查询语句的内存处理区域(但不能同时指向多个内存处理区域,在某一时刻只能与一个查询语句相连).
声明一个游标变量的需要注意的步骤:
1:定义一个REF CURSOU数据类型,如:
TYPE ref_cursor_type IS REF CURSOR;
2:声明一个该数据类型的游标变量,如:
cv_ref REF_CURSOR_TYPE;
3,在打开的时候和一个SQL语句关联:
OPEN cursor_variable_name
FOR select_statement;
后面这和游标的使用相同了,如下例:
DECLARE TYPE refcur_type IS REF CURSOR; book_refcur refcur_type ; v_isbn varchar2(100); v_title varchar2(100); BEGIN OPEN book_refcur FOR SELECT ISBN, TITLE FROM BOOKS WHERE rownum<3; FETCH book_refcur INTO v_isbn,v_title; WHILE book_refcur%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_isbn||': '||v_title); FETCH book_refcur INTO v_isbn,v_title; END LOOP; CLOSE book_refcur; -- open cursoe with another sql statement DBMS_OUTPUT.PUT_LINE('------- open cursoe with another sql statement'); OPEN book_refcur FOR SELECT ISBN, category FROM BOOKS WHERE rownum<3; FETCH book_refcur INTO v_isbn,v_title; WHILE book_refcur%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_isbn||': category is: '||v_title); FETCH book_refcur INTO v_isbn,v_title; END LOOP; CLOSE book_refcur; END;下面的链接是一个对游标非常完整的解释 http://www.cnblogs.com/huyong/archive/2011/05/04/2036377.html
相关文章推荐
- PLSQL中显示游标使用的4个步骤
- Oracle--plsql游标创建和使用
- Oracle--plsql游标创建和使用
- sqlserver游标使用步骤示例(创建游标 关闭游标)
- Oracle使用——PLSQL的中文乱码显示全是问号
- 利用5个标签,4个文本框,2个按钮,自己设计布局实现输入三边求三角形面积。界面如下所示。三角形类的编写可以使用实验4中已经写过的三角形类,当点击“判断三边”时,若能构成三角形,在标签5上显示“可以构成三角形!”,如不能构成三角形,在标签5上显示“不能构成三
- Oracle使用——PLSQL的中文乱码显示全是问号
- Oracle使用——PLSQL的中文乱码显示全是问号
- Oracle使用——PLSQL的中文乱码显示全是问号
- 显示游标的使用详解
- 关于显示游标的使用
- jquery.masonry瀑布流插件的4个使用步骤
- plsql中游标使用
- plsql使用Text Importer导入csv数据时不显示导入的个数出现假死的解决办法
- PLSQL游标的使用
- Oracle PLSQL Demo - 14.定义定参数的显示游标
- Oracle游标创建和使用的语法和举例(显示和隐式游标)
- PLSQL学习笔记--游标的使用
- 使用游标的步骤
- 只需4个步骤:使用 React 实现页面过渡动画