Oracle游标

简介: 游标分显示游标跟隐式游标,它们都具有%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT四个属性。 %FOUND:如果SQL语句至少影响到一行数据,则该属性为true,反之为false。

游标分显示游标跟隐式游标,它们都具有%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT四个属性。

%FOUND:如果SQL语句至少影响到一行数据,则该属性为true,反之为false。

%NOTFOUND:与%FOUND相反。

%ISOPEN:判断游标是否打开。

%ROWCOUNT:返回爱SQL语句影响的行数。

1.显示游标

 Oracle的游标可以设置参数值,如下,IN表示参数的方向,可以省略,参数的类型不需要指定长度

DECLARE CURSOR emp_cur(jobName IN VARCHAR2:='SALESMAN') IS
SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB=jobName;

1.1用变量接收值。游标循环时用参数接收值,类似于MS SQL SERVER 的游标。

DECLARE EMP_NO EMP.EMPNO%TYPE;
        EMP_NAME EMP.ENAME%TYPE;
        EMP_SAL EMP.SAL%TYPE;
BEGIN
  OPEN emp_cur('MANAGER'); --打开游标
  FETCH emp_cur INTO EMP_NO,EMP_NAME,EMP_SAL;  --读取第一行
  WHILE emp_cur%FOUND LOOP  --循环判断,用%FOUND 返回TRUE则表示读取到了
    DBMS_OUTPUT.put_line('FETCH CURSOR--'||EMP_NO||'--'||EMP_NAME||'--'||'--'||EMP_SAL);
    FETCH emp_cur INTO EMP_NO,EMP_NAME,EMP_SAL; --读取下一行
  END LOOP;
END;


END;

1.2 用记录类型

DECLARE CURSOR cur_emp(var_job IN VARCHAR2:='SALESMAN') IS
SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB=var_job;

TYPE emp_record IS RECORD --定义记录类型
(
     EMPNO EMP.EMPNO%TYPE,
     ENAME EMP.ENAME%TYPE,
     SAL EMP.SAL%TYPE
);
emp_row emp_record;  --定义类型对象
BEGIN
  OPEN cur_emp('MANAGER');
  FETCH cur_emp INTO emp_row; --读取数据到记录对象
  WHILE cur_emp%FOUND LOOP
    DBMS_OUTPUT.put_line(emp_row.EMPNO||'--'||emp_row.ENAME||'--'||'--'||emp_row.SAL);
    FETCH cur_emp INTO emp_row;
  END LOOP;
  CLOSE cur_emp; --关闭游标
END;

1.3 FOR循环读取游标

1.3.1 读取游标

DECLARE CURSOR mycur(VAR_JOB VARCHAR2:='SALESMAN') IS
SELECT * FROM EMP WHERE JOB=VAR_JOB;
BEGIN
  FOR cur IN mycur LOOP
    DBMS_OUTPUT.put_line(cur.EMPNO||'--'||cur.ENAME||'--'||'--'||cur.SAL||'--'||cur.JOB);
    END LOOP;
  END;

1.3.2 直接循环SQL语句

FOR cur IN (SELECT * FROM EMP) LOOP
   DBMS_OUTPUT.put_line('FOR--'||cur.EMPNO||'--'||cur.ENAME||'--'||'--'||cur.SAL||'--'||cur.JOB);
END LOOP;

 

2.隐式游标

2.1在执行一个SQL,ORACLE会自动的创建一个隐式游标,如INSERT,UPDATE,DELETE语句。使用时需要在属性前面加上隐式游标默认的标识--SQL

--INSERT INTO EMP VALUES('7935','KEN','ENGINEER',7902,SYSDATE,2000,'',20);
UPDATE EMP SET SAL=SAL+100; IF SQL%NOTFOUND THEN DBMS_OUTPUT.put_line('NOTFOUND'); ELSE DBMS_OUTPUT.put_line(SQL%ROWCOUNT||'受影响'); END IF;

 

目录
相关文章
|
1月前
|
SQL 存储 Oracle
Oracle系列十三:游标
Oracle系列十三:游标
|
4月前
|
存储 SQL Oracle
|
7月前
|
SQL 存储 Oracle
Oracle 游标&子程序&触发器
游标的作用:处理多行数据,类似与java中的集合
50 0
|
10月前
|
存储 Oracle 关系型数据库
oracle 存储过程~游标
oracle 存储过程~游标
|
10月前
|
SQL 缓存 监控
为什么Oracle中包含绑定变量的SQL会有多个游标?(译文)
为了改进包含绑定变量的SQL的执行计划,Oracle在11g版本中引入了一项名为自适应游标共享(ACS,Adaptive Cursor Sharing)的新功能。
105 0
|
Oracle 关系型数据库
oracle学习56-plsql轻量版游标的使用2
oracle学习56-plsql轻量版游标的使用2
69 0
oracle学习56-plsql轻量版游标的使用2
|
Oracle 关系型数据库
oracle学习55-plsql轻量版游标的使用
oracle学习55-plsql轻量版游标的使用
59 0
oracle学习55-plsql轻量版游标的使用
|
存储 Oracle 关系型数据库
SSM-Mybatis调用Oracle存储过程返回结果集(游标)示例
SSM-Mybatis调用Oracle存储过程返回结果集(游标)示例
|
SQL Oracle 关系型数据库
一次难忘的Oracle数据更新经历,用游标?还是用动态SQL?
最近工作中遇到一个比较棘手的问题,拿出来和大家分享一下。
一次难忘的Oracle数据更新经历,用游标?还是用动态SQL?
|
SQL 缓存 Oracle
Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法
Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法
517 0
Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法