oracle 游标

 游标:隐式游标和显示游标。

1 隐式游标

隐式游标种类:

DML操作和单行SELECT语句会使用隐式游标,它们是: 
* 插入操作:INSERT。 
* 更新操作:UPDATE。 
* 删除操作:DELETE。 
* 单行查询操作:SELECT ... INTO ...(一次只能从数据库中提取一行数据,获取多行数据用显示游标)。 

游标属性:

隐式游标的属性 返回值类型   意    义   
SQL%ROWCOUNT    整型  代表DML语句成功执行的数据行数   
SQL%FOUND   布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功   
SQL%NOTFOUND    布尔型 与SQL%FOUND属性返回值相反   
SQL%ISOPEN  布尔型 DML执行过程中为真,结束后为假

示例1:使用隐式游标的属性,判断对雇员工资的修改是否成功。 

BEGIN
  UPDATE emp SET sal = sal + 100 WHERE empno = 1234;
  IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');
    COMMIT;
  ELSE
    DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');
  END IF;
END;

  

2 显示游标

游标步骤:声明游标 、打开游标 、提取数据、关闭游标。

显式游标的属性:

游标的属性   返回值类型   意    义   
%ROWCOUNT   整型  获得FETCH语句返回的数据行数   
%FOUND  布尔型 最近的FETCH语句返回一行数据则为真,否则为假   
%NOTFOUND   布尔型 与%FOUND属性返回值相反   
%ISOPEN 布尔型 游标已经打开时值为真,否则为假  

  

DECLARE
  V_ename VARCHAR2(10);
  CURSOR emp_cursor IS
    SELECT ename FROM emp;
BEGIN
  OPEN emp_cursor;
  IF emp_cursor%ISOPEN THEN
    LOOP
      FETCH emp_cursor
        INTO v_ename;
      EXIT WHEN emp_cursor%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(to_char(emp_cursor%ROWCOUNT) || '-' || v_ename);
    END LOOP;
  ELSE
    DBMS_OUTPUT.PUT_LINE('用户信息:游标没有打开!');
  END IF;
  CLOSE emp_cursor;
END;

  

2.1 fetch 读取游标

declare
  zb_row scsj_zb%rowtype;
  cursor my_cursor is
    select * from scsj_zb where rownum < 3;
begin
  open my_cursor;

  for i in 1 .. 3 loop
    fetch my_cursor
      into zb_row;
    dbms_output.put_line(zb_row.zb_bm);
  end loop;

  close my_cursor;
end;
declare
  zbbm varchar(50);
  zbmc varchar(50);
  cursor my_cursor is
    select zb_bm, zbmc from scsj_zb a where rownum < 3;
begin
  open my_cursor;

  for i in 1 .. 3 loop
    fetch my_cursor
      into zbbm, zbmc;
    dbms_output.put_line(zbbm || ':' || zbmc);
  end loop;

  close my_cursor;
end;

  

SET SERVEROUTPUT ON    
BEGIN  
 FOR re IN (SELECT ename FROM EMP)  LOOP   
  DBMS_OUTPUT.PUT_LINE(re.ename)   
 END LOOP;   
END;  

  

2.2 for 读取游标

declare
  cursor my_cursor is
    select * from scsj_zb where rownum < 3;
begin
  for my_row in my_cursor loop
    dbms_output.put_line(my_row.zb_bm);
  end loop;
end;

详细介绍:https://www.cnblogs.com/guohu/p/11007352.html

原文地址:https://www.cnblogs.com/guohu/p/11008212.html