`

oracle中游标

阅读更多
1. oracle游标
1) 游标简介
使用游标,我们可以对具体操作数据,比如查询的结果,对行,列数据进行更加细致的处理。以及对其他DML操作进行判断等操作。

2) 显示游标
SQL> set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no number;
e_name varchar2(10);
e_sal number;
begin
  open cu_emp;
  fetch cu_emp into e_no,e_name,e_sal;
  while cu_emp%found loop
    dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',基本薪资:'||e_sal);
    fetch cu_emp into e_no,e_name,e_sal;
  end loop;
  close cu_emp;
end;

使用%type匹配类型
SQL> set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no emp.empno%type;
e_name emp.ename%type;
e_sal emp.sal%type;
begin
  open cu_emp;
  fetch cu_emp into e_no,e_name,e_sal;
  while cu_emp%found loop
    dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',基本薪资:'||e_sal);
    fetch cu_emp into e_no,e_name,e_sal;
  end loop;
  close cu_emp;
end;

使用行,查询要使用*查询要使用*查询
SQL> set serverout on;
declare cursor cu_emp is select * from emp;
e emp%rowtype;
begin
  open cu_emp;
  fetch cu_emp into e;
  while cu_emp%found loop
    dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',基本薪资:'||e.sal);
    fetch cu_emp into e;
  end loop;
  close cu_emp;
end;

带条件查询
SQL> set serverout on;
declare cursor cu_emp is select * from emp where sal>2000 and sal<3000;
e emp%rowtype;
begin
  open cu_emp;
  fetch cu_emp into e;
  while cu_emp%found loop
    dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',基本薪资:'||e.sal);
    fetch cu_emp into e;
  end loop;
  close cu_emp;
end;

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

SQL> begin
  if sql%isopen then
     dbms_output.put_line('sql游标已打开');
  else
     dbms_output.put_line('sql游标未打开'); 
  end if;
end;
运行结果:
sql游标未打开

隐式游标rowcount属性
SQL> declare e_count number;
begin
  select count(*) into e_count from emp;
  dbms_output.put_line('游标捕获的记录数:'||sql%rowcount); 
end;
运行结果:
1

使用rowcount判断是否更新
SQL> begin
  update emp set ename='newname' where empno=111;
  if sql%rowcount=1 then
    dbms_output.put_line('已更新');
  else
    dbms_output.put_line('未更新');
  end if;
end;

使用found判断是否更新
SQL> begin
  update emp set ename='newname' where empno=111;
  if sql%found then
    dbms_output.put_line('已更新');
  else
    dbms_output.put_line('未更新');
  end if;
end;

4) 动态游标
强类型动态游标
job='PRESIDENT'或者job='PRESIDENT1'
SQL> declare type emptype is ref cursor return emp%rowtype;
cu_emp emptype;
e_count number;
e emp%rowtype;
begin
  select count(*) into e_count from emp where job='PRESIDENT1';
  if e_count=0 then
    open cu_emp for select * from emp;
  else
    open cu_emp for select * from emp where job='PRESIDENT';
  end if;
  fetch cu_emp into e;
  while cu_emp%found loop
    dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',基本薪资:'||e.sal);
    fetch cu_emp into e;
  end loop;
  close cu_emp;
end;

弱类型动态游标
job='PRESIDENT'或者job='PRESIDENT1'
SQL> declare type customType is ref cursor;
e_count number;
e emp%rowtype;
s salgrade%rowType;
cType customType;
begin
  select count(*) into e_count from emp where job='PRESIDENT1';
  if e_count=0 then
    open cType for select * from salgrade;
    fetch cType into s;
    while cType%found loop
      dbms_output.put_line('等级:'||s.grade||',最低薪资:'||s.losal||',最高工资:'||s.hisal);
      fetch cType into s;
    end loop;
    close cType;
  else
    open cType for select * from emp where job='PRESIDENT';
    fetch cType into e;
    while cType%found loop
      dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',基本薪资:'||e.sal);
      fetch cType into e;
    end loop;
    close cType;
  end if;
end;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics