oracle 遊標分析與理解(基礎)
--------------堅持寫一點 慢慢成長 希望對大家有所幫助(小白的理解) 也是自己學習後的理解(只是一小部分,需要更深沈的還需日後成長)
接下來就是我們的重點
--遊標
提供了一種對從表中檢索出的數據進行操作的靈活手段,
從表中檢索出結果集,從中每次指向一條記錄進行交互的機制.
能對多條數據 每一條數據進行判斷
--遊標的作用
1.指定結果集中特定行的位置.
2.基於當前的結果集位置檢索一行或者連續的幾行.
3.在結果集的當前位置修改行中的數據.
4.對其他用戶所做的數據更愛定義不懂的敏感性級別.
5.可以以編程的方式訪問數據庫
可以看到結果集都標註了紅色,大致意思就是把查詢好的一個結果集當做一個表 然後我們在對這個結果集來進行一些操作.
--遊標的狀態
%Found:Fetch語句(獲取記錄)執行情況,返回Boolean類型
%NotFound:最後一條記錄是否提取出,返回Boolean類型
%ISOpen:遊標是否打開,返回Boolean類型
%RowCount:遊標當前提取的行數.
--遊標的創建
Declare
Cursor myCur is select empno,ename,sal from emp;
vna varchar2(10);
vno number(4);
vsal number(7,2) ;
Begin
open myCur;--打開遊標
fetch myCur into vno,vna,vsal;--fetch 遊標名 into 屬性變量
dbms_output.put_line(vno||‘ ‘||vna||‘ ‘||vsal);--打印
close myCur;--關閉遊標
End;
--可以看到上面的方法非常的繁瑣 如果像這樣每次都要打開遊標然後吧東西存到變量裏面再打印出來最後關閉遊標 豈不是很麻煩 所以 有一種方法能夠省去一些步驟也能實現同樣的功能
那就是下面說的這種方法 便利循環遊標 就是用for循環寫的 省去了一些代碼
循環遊標隱式打開遊標,自動滾動獲取一條記錄,並自動創建臨時記錄類型變量存儲記錄,處理完後自動關閉遊標.
for 變量名 in 遊標名
loop
數據處理sql語句;
end loop;
--再介紹一下剛說的功能(對多條數據每一條數據進行判斷) 如果用存儲過程寫的話要寫好幾條語句用遊標只需要一條 即
--創建一個遊標
--把c語言成績大於等於90分的+5分
--大於等於八十小於就是的+10分
--小於80分的+20分
對多條數據 每一條數據進行判斷
DECLARE
CURSOR cur IS SELECT c.*
FROM chenji c,kechen k
WHERE c.kno=k.kno AND k.kname=‘C‘;
BEGIN
FOR cun IN cur--把遊標直接賦予cun變量了(省去上面的一個步驟)
LOOP
IF cun.score>=90 THEN--分支
cun.score:=cun.score+5;
ELSIF cun.score>=80 THEN--分支
cun.score:=cun.score+10;
ELSIF cun.score<80 THEN--分支
cun.score:=cun.score+20;
END IF;--結束分支
UPDATE chenji SET score=cun.score WHERE kno=cun.kno AND stuno=cun.stuno;
COMMIT; --修改後的提交方法
END LOOP; --結束循環
END;
loop的寫法容易寫錯不建議使用 這就沒分享 for循環比較熟悉一些不容易寫錯 公認比較好的
--如果說我們要一直使用這個遊標那麽就要每次選中然後執行這樣是不是太麻煩了呢?
--那麽就有一種辦法解決這一麻煩的操作 上一次說的存儲過程相當於一個方法 這一塊就可以把遊標和存儲過程寫在一起想要使用的時候直接調用就行了
CREATE OR REPLACE PROCEDURE p1
AS
CURSOR cur IS
SELECT cj.stuno,cj.kno,cj.score
FROM kecheng k,chengji cj
WHERE k.kno=cj.kno AND
k.kname=‘C‘;
BEGIN
FOR ccc IN cur -- 循環取出每一條數據
LOOP
--dbms_output.put_line(ccc.stuno||‘-‘||ccc.kno||‘-‘||ccc.score);
IF ccc.score>=90 THEN -- 判斷條件 3條分支
ccc.score:=ccc.score+5;
ELSIF ccc.score>=80 AND ccc.score<90 THEN
ccc.score:=ccc.score+10;
ELSIF ccc.score<80 THEN
ccc.score:=ccc.score+20;
END IF;
--- 成績已經計算出來,開始修改數據庫表
UPDATE chengji SET score=ccc.score
WHERE stuno=ccc.stuno AND
kno=ccc.kno;
END LOOP;
END;
SELECT * FROM chengji;--中間查詢用的
-- 調用
DECLARE
BEGIN
p1();--調用
END;
好了 自己的見解就這些希望給需要的朋友一些幫助 自己也是個小白 還是那句話慢慢成長
在這也推薦一個大佬 我有一些不知道怎麽解釋的就借鑒他的@不經意的回眸https://www.cnblogs.com/miciing/articles/2783026.html
好東西就要拿出來分享 拜拜!
時間2019-3-2 淩晨0:17分
HaoDi888
oracle 遊標分析與理解(基礎)