赞
踩
游标(CURSOR):游标是把从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作。
游标是用来处理使用SELECT语句从数据库中检索到的多行记录的工具。借助于游标的功能,数据库应用程序可以对一组记录逐条进行处理,每次处理一行。
(ORACLE在创建隐式游标时,默认的游标名为SQL)
1)游标的主要属性(显示游标、隐式游标)
注意: 属性名与游标名之间没有空格。 游标的属性只能在PL/SQL块中使用,而不能在SQL语句中使用 例1 将PRODUCTS表中类型为1的所有产品的单价打9折,并显示该更新所影响的行数.
- BEGIN
- UPDATE products
- SET unitprice=unitprice*0.9
- WHERE categoryid=1;
- IF SQL%FOUND THEN
- dbms_output.put_line(‘更新了’||SQL%ROWCOUNT||’条记录’);
- ELSE
- dbms_output.put_line(‘没有更新记录’);
- END IF;
- END;
复制
1)定义游标
在使用显示游标之前,必须先在声明部分定义游标,其定义语法如下: CURSOR cursor_name[(parameter,…)] IS select_statement; 说明: 参数parameter形式如下:para_name [IN] data_type [:=|DEFAULT value]
(2)打开游标
当打开游标时,ORACLE会执行游标所对应的SELECT语句,并将结果存放到结果集,其定义语法如下: OPEN cursor_name[(parameter,…)];
(3)提取数据语法如下:
FETCH cursor_name INTO variable[,…]; 说明:
(4)关闭游标
关闭游标可释放其结果集,语法如下: CLOSE cursor_name;说明:关闭游标,就是使游标所对应的内存工作区变为无效,并释放与游标相关的系统资源
例2:用显式游标显示输出products表中供应商编号为6 的产品的信息。
- DECLARE
- CURSOR prod_cursor IS
- select *from products where
- supplierid=6;
- prod_record products%rowtype;
- BEGIN
- OPEN prod_cursor;
- LOOP
- FETCH prod_cursor INTO prod_record;
- EXIT WHEN
- prod_cursor%NOTFOUND;
- dbms_output.put_line(‘产品编号’||prod_record.productid);
- dbms_output.put_line(‘产品名称’||prod_record.productname);
- dbms_output.put_line(‘供应商编号’||prod_record.supplierid);
- END LOOP;
- CLOSE prod_cursor;
- END;
复制
例3:用显式参数游标显示输出products表中供应商编号为XX 的产品的信息。
- DECLARE
- CURSOR prod_cursor (suppID in number DEFAULT 1) IS
- select * from products where
- supplierid=suppId;
- prod_record products%rowtype;
- BEGIN
- OPEN prod_cursor(2);
- LOOP
- FETCH prod_cursor INTO prod_record;
- EXIT WHEN
- prod_cursor%notfound;
- dbms_output.put_line(‘产品编号’||prod_record.productid);
- dbms_output.put_line(‘产品名称’||prod_record.productname);
- dbms_output.put_line(‘供应商编号’||prod_record.supplierid);
- END LOOP;
- CLOSE prod_cursor;
- END;
复制
注意:在为参数游标定义参数的数据类型时,不能使用长度约束
语法格式: FOR 循环变量 IN 游标类型名 LOOP 循环语句 END LOOP; 注意:
例4:用显式参数游标显示输出products表中供应商编号为XX 的产品的信息。
- DECLARE
- CURSOR prod_cursor (suppID in number DEFAULT 1) IS
- select *from products where supplierid=suppId;
- BEGIN
- FOR v_pr IN prod_cursor(3) LOOP
- dbms_output.put_line(‘产品编号’||v_pr.productid);
- dbms_output.put_line(‘产品名称’||v_pr.productname);
- dbms_output.put_line(‘供应商编号’||v_pr.supplierid);
- END LOOP;
- END;
复制
游标包括显示游标和隐式游标,在定义时与特定的查询绑定,即在声明中定义查询,其结构是不变的,因此又称静态变量。
游标变量是一个指向多行查询结果集的指针,不与特定的查询绑定,可以在打开游标变量时定义查询,可以返回不同结构的结果集。
在PL/SQL 中,使用游标变量包括定定义游标引用类型(REF CURSOR),声明游标变量,打开游标变量、检索游标变量、关闭游标变量等几个基本步骤。
游标变量基本步骤:
(1) 定义游标CURSOR类型的指针TYPE type_name IS REF CURSOR [RETURN return_type]; type_name 是新引用类型的名字 而return_type表示该游标变量返回的记录类型。 (2) 声明REF CURSOR类型的变量 游标变量 type_name;
(3) 打开游标变量的语法格式如下所示: OPEN 游标变量名 FOR SELECT 语句;
(4) 检索游标变量
检索游标变量的方法与检索静态游标相似,使用 FETCH…. INTO 语句循环检索游标变量的 结果集中的记录。语法为:
- LOOP
- FETCH cursor _ variable INTO variablel,variable2........;
- EXIT WHEN Cursor_ variables%NOTFOUND;
- ........
- END LOOP;
- 检索游标变量时只能使用简单循环或 WHILE 循环,不能采用 FOR 循环.
复制
(5)关闭游标变量
检索并处理完游标变量所对应的结果集后,可以关闭游标变量,释放存储空间。语法为;
close 游标变量名;
游标变量的不同定义方式举例
- DECLARE
- 1、-- 用 %ROWTYPE类型定义游标变量的返回值.
- TYPE t_productsRef IS REF CURSOR
- RETURN products%ROWTYPE;
- 2、 -- 定义一个新的记录类型
- TYPE t_prodRecord IS RECORD (
- prodid products.productid%TYPE,
- prodname products.productname%TYPE);
- --定义游标变量的返回值为记录类型变量
- TYPE t_prodRef IS REF CURSOR
- RETURN t_prodRecord;
复制
例5:使用游标变量查询出产品表中类别为1的产品的信息,并输出产品名称、类别编号、单价。
- DECLARE
- TYPE prod_record IS RECORD
- ( pname products.productname%type,
- cid products.categoryid%type,
- uprice products.unitprice%type);
- TYPE prod_cursor IS REF CURSOR RETURN prod_reord;
- v_prodcur prod_cursor ;
- v_prodrec prod_record;
- BEGIN
- OPEN v_prodcur FOR select productname,categoryid,unitprice from products where categoryid=1;
- LOOP
- FETCH v_prodcur INTO v_prodrec ;
- EXIT WHEN v_prodcur%notfound;
- dbms_output.put_line (‘产名’||v_prodrec.pname);
- dbms_output.put_line(‘产品类别’||v_prodrec.cid);
- dbms_output.put_line (‘单价’||v_prodrec.uprice);
- End LOOP;
- Close v_prodcur;
- End;
- 使用同一游标变量打开多个查询
- 例6:使用游标变量查询出产品表中类别为1的产品的信息,然后查询输出产品单价小于20的产品信息。
复制
- DECLARE
- TYPE prod_cursor IS REF CURSOR;
- v_cur prod_cursor;
- v_rec products%rowtype;
- BEGIN
- OPEN v_cur FOR select * from products where categoryid=1;
- LOOP
- FETCH v_cur INTO v_rec;
- EXIT WHEN v_cur%notfound;
- dbms_output.put_line('产品名' || v_rec.productname);
- dbms_output.put_line('产品类别' || v_rec.categoryid);
- dbms_output.put_line('单价' || v_rec.unitprice);
- End LOOP;
- OPEN v_cur FOR select * from products where unitprice<20;
- LOOP
- FETCH v_cur INTO v_rec;
- EXIT WHEN v_cur%notfound;
- dbms_output.put_line('产品名' || v_rec.productname);
- dbms_output.put_line('产品类别' || v_rec.categoryid);
- dbms_output.put_line('单价' || v_rec.unitprice);
- End LOOP;
- Close v_cur;
- End;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。