oracle游标
游标——数据的缓存区
什么是游标
游标的使用可以让用户想操作数组一样操作查询出来的数据集,实际上,它提供了一种从集合性质的结果中提取单挑记录的手段。
游标(Cursor)形象地看出一个变动的光标。它实际上是一个指针,它在一段oracle存放数据查询结果集的内存中,它可以指向结果集中的任意记录,初始是指向首记录。想数组的结构。
游标的种类:
oracle游标分静态游标和REF游标两种,其中静态游标像一个数据快照,打开游标后的结构集是对数据库数据的一个备份,数据不随着对表执行DML操作改变。
静态游标分成两种:
- 显示游标:是指在使用之前有明确的游标声明和定义,这样游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结果集进行任何操作,显示游标有用户控制。
- 隐式游标:它被PL/sql自动关联,也叫SQL游标,由Oracle管理,用户无法控制但可以得到它的属性信息
显示游标
--创建语法
CURSOR cursor_name
[(parameter_name datatype,...)]
IS select_statement;
--声明游标
DECLARE CURSOR cursor_name
IS SELECT_STATEMENT
--打开游标
OPEN cursor_name
--读取数据
FETCH cursor_name INTO Record_name
--关闭游标
CLOSE cursor_name
--创建一个游标并使用它
DECLARE
CURSOR pdct_cur
IS SELECT * FROM PRODUCTINFO ;
cur_prodrcd productinfo%ROWTYPE;
BEGIN
OPEN pdct_cur;
FETCH pdct_cur INTO cur_prodrcd;
DBMS_OUTPUT.PUT_LINE(cur_prodrcd.productid || '-' || cur_prodrcd.productname || '-' || cur_prodrcd.productprice);
CLOSE pdct_cur;
END;
游标中的LOOP语句
通常显示游标的数据不止一条,而是多条记录。这样就需要一个遍历结果集的方式,而LOOP语句就能实现该功能。
DECLARE
CURSOR pdct_loop_cur
IS SELECT PRODUCTID,PRODUCTNAME,PRODUCTPRICE FROM PRODUCTINFO WHERE PRODUCTPRICE > 2500;
cur_productid prodcuctinfo.Productid%TYPE;
cur_productname prodcuctinfo.Productname%TYPE;
cur_productprice prodcuctinfo.Productprice%TYPE;
BEGIN
OPEN pdct_loop_cur;
LOOP
FETCH proct_loop_cur INTO cur_productid,cur_productname,cur_productprice;
EXIT WHEN pdct_loop_cur%notfound;
DBMS_OUTPUT.PUT_LINE('产品ID:' || cur_productid ||' 产品名称: ' || cur_productname ||' 产品价格:' || cur_productprice);
END LOOP;
CLOSE pdct_loop_cur;
END;
使用BULK COLLECT和FOR语句的游标
游标中通常使用FETCH…INTO…语句提取数据,这种方式是单条数据提取,而FETCH…BULK COLLECT INTO 语句可以批量提取数据
DECLARE
CURSOR pdct_collect_cur
IS SELECT * FROM PRODUCTINFO;
TYPE PDCT_TAB IS TABLE OF PRODUCTINFO%ROWTYPE;
pdct_rd PDCT_TAB;
BEGIN
OPEN pdct_collect_cur;
LOOP
FETCH pdct_collect_cur BULK COLLECT INTO pdct_rd limit 2;
FOR i in 1..pdct_rd.count LOOP
DBMS_OUTPUT.PUT_LINE('产品ID:' || pdct_rd(i).productid || ' 产品名称:' ||prct_rd(i).productname|| ' 产品价格:' || pdct_id(i).productprice);
END LOOP;
EXIT WHEN pdct_collect_cur%NOTFOUND;
END LOOP;
CLOSE pdct_collect_cur;
END;
使用CURSOR FOR LOOP
游标很多机会都是迭代结果集,我们可以使用更简单的方式实现,CURSOR FOR LOOP不需要特别的声明变量,它可以提出行对象类型的数据。
DECLARE
CURSOR cfl IS SELECT productname,productprice FROM PRODUCTINFO WHERE productprice > 1200;
BEGIN
FOR curcfl IN cfl
LOOP
DBMS_OUTPUT.PUT_LINE('名称: ' || curcfl.productname || ' 产品价格: ' || curcfl.prodycrprice);
END LOOP;
END;
显示游标的属性
- %ISOPEN 判断是否打开,打开返回TRUE
- %FOUND 检测行数据是否有效,有效返回TRUE
- %NOTFOUND 如果没有提取返回TRUE
- %ROWCOUNT 累计到当前为止使用FETCH提取数据的行数
带参数的游标
使用显示游标时是可以指定参数的,指定的参数包括参数的顺序和参数的类型。参数可以传递给游标在查询中使用,这样就方便了用户根据不同的查询条件进行查询,也方便了游标在存储过程中的使用。
DECLARE
cur_productid productinfo.Productid%TYPE := '0240';
cur_productprice productinfo.Productprice%TYPE := '1200';
cur_prodrcd productinfo%TYPE;
CURSOR pdct_parameter_cur (id VARCHAR,price NUMBER)
IS SELECT * FROM PRODUCTINFO
WHERE productid like id ||'%'
AND productprice > price;
BEGIN
OPEN pdct_parameter_cur(cur_productid,cur_productprice);
LOOP
FETCH pdct_parameter_cur INTO cur_prodrcd;
EXIT WHEN pdct_parameter_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('产品ID:' || cur_prodrcd.productid || '产品名称: ' || cur_prodrcd.productname || ' 产品价格:' || cur_prodrcd.productprice);
END LOOP;
CLOSE pdct_parameter_cur;
END;
隐式游标
每当运行SELECT或DML语句时,PL/SQL会打开一个隐式的游标。隐式游标不受用户的控制,这一点和显示游标有明显的不同。
- 隐式游标由PL/SQL自动管理
- 隐式游标的默认名称是SQL
- SELECT或DML操作产生隐式游标;
隐式游标的属性值始终是最新执行的SQL语句
DECLARE
cur_productname productinfo.Productname%TYPE;
cur_productprice productinfo.Productprice%TYPE;
BEGIN
SELECT productname,productprice INTO cur_productname,cur_productprice
FROM PRODUCTINFO
WHERE productid = ‘0240040001’;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘产品名称: ’ || cur_productname || ’ 产品价格: ’ || cur_productprice);
END IF ;
END;
隐式游标的属性
- %ISOPEN 判断是否打开,永远返回FALSE
- %FOUND 检测DML操作是否有效,有效返回TRUE
- %NOTFOUND 如果没有提取返回TRUE
- %ROWCOUNT DML操作对数据影响的数量
相关阅读
sqlserver游标基本概念到生命周期的详细学习(sql游标
在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着