您的位置:首页 > 数据库

PL/SQL 游标

2017-06-07 09:20 288 查看

一、说明

游标字面理解就是游动的光标。

用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等等。

二、分类

显式游标

用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理。
隐式游标

是在执行插入(INSERT)、删除(DELETE)、修改(UPDATE)和返回单条记录的查询(SELECT)语句时有PL/SQL自动定义的。

三、属性

Oracle 游标有4个属性: %ISOPEN , %FOUND , %NOTFOUND, %ROWCOUNT
%ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于false
%FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false
%ROWCOUNT 返回当前位置为止游标读取的记录行数。

四、使用

声明游标

CURSOR emp_info(vartype number) is select * from emp;
打开游标

open emp_info;
读取游标

fetch mycur into varno,varprice;
关闭游标

close emp_info;

五、显示游标遍历

方法一
DECLARE
V_EMP_INFO EMP%ROWTYPE;
CURSOR EMP_INFO IS
SELECT * FROM EMP;   --1、声明游标
BEGIN
OPEN EMP_INFO;         --2、打开游标,传递参数值
LOOP
FETCH EMP_INFO INTO V_EMP_INFO;   --3、提取游标fetch into
IF EMP_INFO%FOUND THEN
DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||
V_EMP_INFO.HIREDATE);
ELSE
DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
EXIT;
END IF;
END LOOP;
CLOSE EMP_INFO;       --4、关闭游标
END;

方法二
DECLARE
V_EMP_INFO EMP%ROWTYPE;
CURSOR EMP_INFO IS
SELECT * FROM EMP; --1、声明游标
BEGIN
OPEN EMP_INFO; --2、打开游标,传递参数值
LOOP
FETCH EMP_INFO INTO V_EMP_INFO; --3、提取游标fetch into
EXIT WHEN EMP_INFO%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||
V_EMP_INFO.HIREDATE);
END LOOP;
DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
CLOSE EMP_INFO; --4、关闭游标
END;

方法三
DECLARE
V_EMP_INFO EMP%ROWTYPE;
CURSOR EMP_INFO IS
SELECT * FROM EMP; --1、声明游标
BEGIN
FOR V_EMP_INFO IN EMP_INFO LOOP
DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||
V_EMP_INFO.HIREDATE);
END LOOP;
DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
END;

六、隐式游标处理

DECLARE
V_EMP_INFO EMP%ROWTYPE;
BEGIN
SELECT * INTO V_EMP_INFO FROM EMP WHERE ename='SMITH';
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||
V_EMP_INFO.HIREDATE);
END IF;
DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PLSQL Oracle LOOP 循环