oracle中的游标使用静态游标
游标是构建在PL/SQL中 用来查询数据 获取记录集的指针 它让开发者 一次访问结果集中一行记录 在oracle中提供了两种游标 静态游标 ref游标 静态游标 静态游标是在编译的时候就被确定 然后把结果集复制到内存中 静态游标又分为两种 隐式游标和显示游标 ref游标 ref游标是在运行的时候加载结果集 先来看看静态游标中的隐式游标 在PL/SQL中为所有的SQL数据操纵语句(包括返回一行的select)隐式声明游标 称为隐式游标 主要原因是用户不能直接命名和控制此类游标 当用户在PL/SQL 中使用数据操纵语句(DML)时 oracle预先定义一个名称为SQL的隐式游标 通过 检查隐式游标的属性获取与最近执行的SQL语句相关信息 在执行DML语句之后 隐式游标属性返回信息 隐式游标属性包括 %found %notfound %rowcount %isopen %found 只有DML语句影响一行或多行时 %found属性才返回true declare num number; begin update emp set empno= where empno= ; if sql%found then dbms_output put_line( 存在记录 ); else dbms_output put_line( 不存在记录 ); end if; end; %notfound %notfound属性作用正好跟%found属性相反 如果DML语句没有影响任何行数 则%notfound属性返回true declare begin delete from emp where empno= ; if sql%notfound then dbms_output put_line( 删除失败 ); end if; end; %rowcount %rowcount属性返回DML语句影响的行数 如果DML语句没有影响任何行数 则%rowcount属性将返回 declare num number; begin update emp set empno= where empno= ; if sql%rowcount= then dbms_output put_line( 不存在记录 ); else dbms_output put_line( 存在记录 ); end if; end; %isopen %isopen属性判断SQL游标是否已经打开 在执行SQL语句之后 oracle自动关闭SQL 游标 所以隐式游标的%isopen属性始终为false 在PL/SQL中向标准的select语句增加单独的into子句 就可以将从表或视图中查询的记录赋予变量或行变量 需要注意的是select into 语句结果必须有且只能有一行 如果查询没有返回行 PL/SQL将抛出no_data_found异常 如果查询返回多行 则抛出 too_many_rows 异常 如果抛出异常 则停止执行 控制权转移到异常处理部分(没有 异常处理 则程序中断) 在引发异常时 将不使用属性%found %notfound %rowcount来查明DML语句是否 已影响了行数 declare num number; begin select empno into num from emp where empno= ; if sql%rowcount= or sql%notfound then dbms_output put_line( 不存在记录 ); else dbms_output put_line( 存在记录 ); end if; end; 显示游标 显示游标是由用户显示声明的游标 根据在游标中定义的查询 查询返回的行集合可以 包含零行或多行 这些行称为活动集 游标将指向活动集中的当前行 显示游标的操作过程 使用显示游标的 个步骤 ( )声明游标 ( )打开游标 ( )从游标中获取结果集 ( )关闭游标 cursor cursor_name [(parameter[ parameter])] [return return_type] is select_statement; cursor_name 指游标的名称 parameter 为游标指定输入参数 return_type 定义游标提取行的行类型 select_statement 为游标定义查询语句 open 游标名称 fetch 从游标中提取行 close 关闭游标 打开游标 执行游标中定义的查询语句 绑定输入参数 将游标指针指 向结果集的BOF位置 open cursor_name [parameters] fetch 在打开游标之后 可以从游标中提取记录 fetch cursor_name into variable_name; fetch 是提取结果集中一行记录存储在变量中 每次提取之后 结果集指针 就向前移动一行 close 在处理游标中的所有行之后 必须关闭游标 以释放分配给游标的所有资源 close cursor_name 用户可以通过检查游标属性来确定游标的当前状态 显示游标的属性如下 %found 如果执行最后一条fetch语句 成功返回行 则%found属性为true %notfound 如果执行最后一条fetch语句 未能提取行 则%notfound属性为true %isopen:如果游标已经打开 则返回true 否则返回false %rowcount 返回到目前为止游标提取的行数 %rowcount为数字类型属性 在第一 次获取之前 %rowcount为零 当fetch语句返回一行时 则该数加 declare info emp%rowtype; cursor my_cur is select * from emp where empno= ; begin open my_cur; dbms_output put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output put_line(info empno); dbms_output put_line(my_cur%rowcount); end if; end loop; close my_cur; end; 使用显示游标删除或更新 使用游标时 如果处理过程中需要删除或更新 在定义游标查询语句时 必须使用select for update语句 而在执行delete或update时使用 where current of 子句指定游标当前行 cursor cursor_name is select_statement for update[of column] wait/nowait 在使用for update 子句声明游标之后 可以使用以下语法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必须出现在for update of 子句中 select 语句必须只包括一个表 而且delete和update语句只有在打开游标并且提取 特定行之后才能使用 declare cursor cur_emp is select * from emp where sal< for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal= where current of cur_emp; end loop; close cur_emp; end; 带参数的显示游标 PL/SQL中允许显示游标接受输入参数 用于声明带参数的显示游标语法 cursor cursor_name[ data_type] [return ] is select_statement declare dept_num emp deptno%type; emp_num emp empno%type; emp_nam emp ename%type; cursor emp_cur(deptparam number) is select empno ename from emp where deptno=deptparam; begin dept_num :=&部门编号; open emp_cur(dept_num); loop fetch emp_cur into emp_num emp_nam; exit when emp_cur%notfound; dbms_output put_line(emp_num|| ||emp_nam); end loop; close emp_cur; end; 可以使用循环游标来简化显示游标 循环游标隐式打开显示游标(不需要open) 自动从结果集提取记录 然后处理完所有记录自动关闭游标 循环游标自动创建 %rowtype类型的变量并将此变量用做记录的索引 循环游标语法如下 for record_index in cursor_name record_index是PL/SQL自动创建的变量 此变量的属性声明为%rowtype类型 作用 域for循环之内 循环游标的特性有 从游标中提取所有记录之后自动关闭游标 lishixinzhi/Article/program/Oracle/201311/18322
oracle游标和游标变量的区别?
oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区.\x0d\x0a游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区.\x0d\x0aoracle游标和游标变量是不能相互代替的.\x0d\x0a如何定义游标类型\x0d\x0aTYPE ref_type_name IS REF CURSOR [RETURN return_type];\x0d\x0a声明游标变量\x0d\x0acursor_name ref_type_name;\x0d\x0a \x0d\x0aref_type_name 是后面声明游标变量时要用到的我们的游标类型(自定义游标类型,即CURSOR是系统默认的,ref_type_name是我们定义的 );return_type代表数据库表中的一行,或一个记录类型\x0d\x0aTYPE ref_type_name IS REF CURSOR RETURN employee%TYPE\x0d\x0aRETURN 是可选的,如果有是强类型,可以减少错误,如果没有return是弱引用,有较好的灵活性.\x0d\x0a \x0d\x0a不能在包头里面声明游标变量,注意,但可以定义游标类型,要注意这二者的区别.\x0d\x0a可以声明游标变量作为函数或过程的形式参数.\x0d\x0a%TYPE一个列类型\x0d\x0a%ROWTYPE行类型\x0d\x0a控制oracle游标变量\x0d\x0aOPEN-FOR(打开游标变量,与多行查询连接起来) FETCH(从结果集中取行数据),close(关闭游标变量)\x0d\x0aBULK COLLECT子句将游标变量中的行一次性提取到一个集合中.
oracle中游标的作用有哪些?什么情况下使用?
存储过程中查询语句如何返回多行结果?我们知道,如果存储过程中查询语句有多行结果输出,会报错。若想让存储过程中的查询语句返回多行结果不报错,则需要使用游标来实现。本例主要也是用来熟悉存储过程中游标的简单使用方法:SET SERVEROUTPUT ON;create or replace procedure proc_salary is --定义变量 v_empno emp.empno%TYPE;v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; --定义游标 CURSOR emp_cursor IS SELECT empno, ename, sal from emp;BEGIN--循环开始LOOP IF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor; END IF; FETCH emp_cursor INTO v_empno, v_ename, v_sal;--退出循环的条件 EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;dbms_output.put_line('员工编号为' || v_empno || '的' || v_ename || '薪水为:' || v_sal); END LOOP;END; /
oracle如何关闭游标?
第一,如果游标以open打开的,则使用close关闭:declare;cursor mycursor is;select * from emp for update;myrecord emp%rowtype;beginopen mycursor;loopfetch mycursor into myrecord;exit when mycursor%notfound;if (myrecord.sal=2000) thenupdate empset sal=2018where current of mycursor;end if;end loop;close mycursor;commit;end;第二,使用for 循环的,则循环结束游标自动关闭:declarecursor mycursor isselect * from emp;beginfor i in mycursorloopdbms_output.put_line(i.job);end loop;end;oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区。游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区。oracle游标和游标变量是不能相互代替的。如何定义游标类型:TYPE ref_type_name IS REF CURSOR [RETURN return_type];声明游标变量:cursor_name ref_type_name;