1. 程式人生 > >ORACLE遊標學習

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;