ORACLE游标学习

方式一:

set serverout on;
//这里定义的游标cu_emp可以理解为一个数组一样的东西
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;
  //found如果数据存在的话输出
  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;
输出:
编号:9000,姓名sb,基本薪资
编号:7369,姓名SMITH,基本薪资800
编号:7499,姓名ALLEN,基本薪资1600
编号:7521,姓名WARD,基本薪资1250
编号:7566,姓名JONES,基本薪资2975
编号:7654,姓名MARTIN,基本薪资1250
编号:7698,姓名BLAKE,基本薪资2850
编号:7782,姓名CLARK,基本薪资2450
编号:7788,姓名SCOTT,基本薪资3000
编号:7839,姓名KING,基本薪资5000
编号:7844,姓名TURNER,基本薪资1500
编号:7876,姓名ADAMS,基本薪资1100
编号:7900,姓名JAMES,基本薪资950
编号:7902,姓名FORD,基本薪资3000
编号:7934,姓名MILLER,基本薪资1300

方式二:(动态指定自定变量类型)

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;
//输出结果和上面的一样就不贴出来了

方式三:(定义一个一行的变量e emp%rowtype;)

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;

方式四:(隐式游标学习)

begin
  if sql%isopen then
    dbms_output.put_line('游标已打开');
  else
    dbms_output.put_line('游标未打开');
  end if;
end;
SQL> declare e_count number;
  2  begin
  3    select count(*) into e_count from emp;
  4    dbms_output.put_line('游标捕获记录数'||sql%rowcount);
  5  end;
  6  /
游标捕获记录数1

方式五:(动态游标)

SQL> declare type customType is ref cursor;
  2  e_count number;
  3  e emp%rowtype;
  4  s salgrade%Rowtype;
  5  cType customType;
  6  begin
  7    select count(*) into e_count from emp where job='PRESIDENT';
  8    if e_count=0 then
  9      open cType for select * from salgrade;
 10      fetch cType into s;
 11      while cType%found loop
 12         dbms_output.put_line('等级:'||s.grade||',最低薪资'||s.losal||',最高薪资'||s.hisal);
 13      fetch cType into s;
 14      end loop;
 15      close cType;
 16    else
 17      open cType for select * from emp where job='PRESIDENT';
 18      fetch cType into e;
 19      while cType%found loop
 20         dbms_output.put_line('编号:'||e.empno||',姓名'||e.ename||',基本薪资'||e.sal);
 21      fetch cType into e;
 22      end loop;
 23      close cType;
 24    end if;
 25    end;
 26  /
编号:7839,姓名KING,基本薪资5000
PL/SQL procedure successfully completed
SQL> declare type customType is ref cursor;
  2  e_count number;
  3  e emp%rowtype;
  4  s salgrade%Rowtype;
  5  cType customType;
  6  begin
  7    select count(*) into e_count from emp where job='PRESIDENT1';
  8    if e_count=0 then
  9      open cType for select * from salgrade;
 10      fetch cType into s;
 11      while cType%found loop
 12         dbms_output.put_line('等级:'||s.grade||',最低薪资'||s.losal||',最高薪资'||s.hisal);
 13      fetch cType into s;
 14      end loop;
 15      close cType;
 16    else
 17      open cType for select * from emp where job='PRESIDENT';
 18      fetch cType into e;
 19      while cType%found loop
 20         dbms_output.put_line('编号:'||e.empno||',姓名'||e.ename||',基本薪资'||e.sal);
 21      fetch cType into e;
 22      end loop;
 23      close cType;
 24    end if;
 25    end;
 26  /
等级:1,最低薪资700,最高薪资1200
等级:2,最低薪资1201,最高薪资1400
等级:3,最低薪资1401,最高薪资2000
等级:4,最低薪资2001,最高薪资3000
等级:5,最低薪资3001,最高薪资9999
PL/SQL procedure successfully completed

附:

1set 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;


2set 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;


3set 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;


4begin
  if sql%isopen then
    dbms_output.put_line('游标已打开');
  else
    dbms_output.put_line('游标未打开');
  end if;
end;

declare e_count number;
begin
  select count(*) into e_count from emp;
  dbms_output.put_line('游标捕获记录数'||sql%rowcount);
end;


5、
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;

猜你喜欢

转载自blog.csdn.net/qq_31681017/article/details/76166946
今日推荐