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操作对数据影响的数量

你可能感兴趣的:(Oracle与数据库语言)