游標 指向乙個結果集的指標

2021-10-11 01:45:09 字數 4202 閱讀 7287

---游標:指向乙個結果集的指標

--便於理解的來說:指標就可以當做是這個結果集,迴圈這個指標,就可以拿到該結果集裡的資料、

分為:隱式游標 和 顯式游標

-----------隱式游標:select .... into ...

--需要注意:

1、查詢的結果只能是1行,不能是0行或者多行

2、不需要宣告,直接可以使用

-----------顯示游標:

--聲明顯式游標的語法結構:

declare

--宣告的部分

cursor 游標名[(引數1 資料型別[,引數2 資料型別.....])] 

isselect 結果集;

begin

--邏輯體

end;

--開發規範:游標名以 c_ 開頭

--使用/執行游標的語法結構:2種

--第1種:需要手動去開啟游標,提取資料,關閉游標

declare

--宣告部分

begin

--邏輯體

open 游標名[(實際引數1[,實際引數2...])];  --開啟游標

fetch 游標名 into 變數;  --提取資料

close 游標名;  --關閉游標(千萬別忘了!)

end;

--第二種:

不需要手動,用for迴圈去拿到游標中的值

declare

--宣告部分

begin

for 迴圈變數 in 游標名 loop

--迴圈體

end loop;

end;

--需要注意的是:

1、顯式游標需要手動宣告,然後才能被使用

2、顯示游標的指向的結果集可以是0行或者多行結果(包括1行)

3、使用/執行游標的方式:

1)方式1:手動管理:開啟,提取,關閉

2)方式2:用for迴圈根據結果集的行數,依次可以拿到每一行的資料(不需要手動管理)

4、結果集時什麼樣子(列名,資料 等),那麼在執行/使用這個游標的時候,用到的就是啥

根據列名,分別拿到每一行的結果

--比如:列印部門10的員工的工號,姓名,入職日期

declare

--定義乙個指標,指向部門10的員工的資訊

cursor c_dept10 

isselect empno, ename, hiredate

from emp 

where deptno = 10;

begin

--迴圈這個指標,分別拿到每一行的值

for x in c_dept10 loop

--也就是這裡的x每次可以指向這個游標(結果集)中的一行資料,從第一行開始,到最後一行結束

dbms_output.put_line('工號:' || x.empno || ' 姓名:' || x.ename || ' 入職日期:' ||

to_char(x.hiredate, 'yyyy-mm-dd'));

end loop;

end;

--小練習一把:列印emp表中經理的工號,姓名,工作,工資

select empno,ename,job,sal

from emp 

where job = 'manager';

--declare

v_job constant varchar2(10) := 'manager';   --用乙個常量來接收 'manager' 這個值

cursor c_manager 

isselect empno, ename, sal from emp where job = v_job;

begin

for x in c_manager loop

dbms_output.put_line('工號:' || x.empno || ' 姓名:' || x.ename || ' 工作:' ||

v_job || ' 工資:' || x.sal);

end loop;

end;

---------------------帶引數的游標:游標名(引數1 資料型別[,引數2 資料型別.....])

--開發規範:引數名以 p_ 開頭

--比如:使用帶引數的游標列印部門10和部門20的員工的工號和姓名

declare

cursor c_dept(p_no10 number, p_no20 number) 

isselect empno, ename from emp where deptno in (p_no10, p_no20);

begin

for x in c_dept(10, 20) loop

dbms_output.put_line('工號:' || x.empno || ' 姓名:' || x.ename);

end loop;

end;

--需要注意的是:

1、引數的資料型別只需要定義型別,不需要定義長度

2、引數的資料型別是什麼型別,那麼給具體的值就需要給對應的型別的值

3、定義了幾個引數,那麼使用的時候就要給幾個值 (值的型別和個數 跟 定義時的 引數的型別和個數 需要一致)

--小練習一把:用帶引數的游標(2個引數)列印部門30的銷售的工號和姓名

declare

cursor c_sales(p_deptno number, p_job varchar2) 

isselect empno, ename

from emp

where deptno = p_deptno

and job = p_job;

begin

for x in c_sales(30, 'salesman') loop

dbms_output.put_line('工號:' || x.empno || ' 姓名:' || x.ename);

end loop;

end;

--引數的值通過變數傳入

--比如:列印某個部門的經理的工號和姓名

declare

v_deptno number := &輸入乙個部門編號;

cursor c_manager(p_deptno number,p_job varchar2)

isselect empno,ename

from emp

where deptno = p_deptno

and job = p_job;

begin

for x in c_manager(v_deptno, 'manager') loop

dbms_output.put_line('工號:' || x.empno || ' 姓名:' || x.ename);

end loop;

end;

--小練習一把:通過帶引數的游標列印某個工資等級中的員工的工號和姓名以及工資等級

declare

v_grade number(1) := &輸入乙個工資等級;

cursor c_grade(p_grade number)

isselect e.empno,e.ename,s.grade

from emp e join salgrade s

on e.sal between s.losal and s.hisal

where s.grade = p_grade;

begin

for x in c_grade(v_grade) loop

dbms_output.put_line('工號:' || x.empno || ' 姓名:' || x.ename||' 工資等級:'||x.grade);

end loop;

end;

乙個儲存過程 游標迴圈結果集

在查詢表名使用變數時只能使用concat 拼接 哭哭哭。drop procedure ifexists proc tmp create procedure proc tmp begin declare done intdefault 0 declare tablename varchar 255 d...

陣列指標 指標指向乙個陣列

include include using namespace std int main void int p 10 先算小括號,p和 結合,屬於指標型別,指標指向擁有十個int型元素的陣列 p a 等價於int p 10 a char p 20 行指標,str 3 20 共三行,每行20個位元組 ...

sql 利用游標遍歷乙個查詢結果

這裡有乙個單位表 unitt idname 1單位1 2單位2 有乙個評分專案表 itemt idname 1專案1 2專案2 有乙個單位得分表 scoret idunitid itemid score11 12022 15031 23042 260現在需要遍歷所有單位將他們的分數查詢出來,就用迴圈...