Oracle 中游標的使用方法練習(自我心得)
阿新 • • 發佈:2019-02-08
遊標是一個記憶體工作區,將資料庫中讀取的東西放入快取中,不需要反覆讀取資料庫。
我的emp表
1、顯示遊標 使用者自己定義一個顯示遊標,通過與遊標有關的語句進行處理,返回結果為多行多列的select語句。
顯示遊標分為4個部分:
1、宣告遊標 DECLEAR部分
2、打卡遊標 BEGIN 定義部分
3、提取遊標 FETCH 遊標名 INTO 變數名
4、關閉遊標 CLOSE
declare --定義部分,建立變數常量遊標以及異常等 avg_sal number(7,2); begin --執行部分,sql流程控制語句 select avg(t.薪水) into avg_sal from VIEW_2 t; --select * into avg_sal from EMP2 t;沒有資料報錯 dbms_output.put_line('Oracle Hello World!'); dbms_output.put_line('程式設計師的平均工資為:'||avg_sal); exception --例外處理部分——處理執行的各種錯誤 WHEN NO_DATA_FOUND Then dbms_output.put_line('未查詢到任何行!'); End;
FOR I IN 1..3 LOOP
//定義一個迴圈下面還可以引用I
END LOOP;
如果我想實現,將學生成績表中分類,用遊標統計選修表SC中分數段在0~59、60~79、80~89、90~100各個區間中人數及人名。那我應該怎麼做呢?
DECLARE CURSOR emp_cursor IS SELECT SNO,sname FROM cs where grade>=90; BEGIN DBMS_OUTPUT.PUT_LINE('上了90分的人有:'); FOR CS_record IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE(CS_record.SNO|| CS_record.Sname); END LOOP; END;
這裡是將分數大於90的人取出放入緩衝區內,***——record是隱含定義的記錄變數,即內建函式。
若要達到上面的效果,則是要將所有資料取到緩衝區內然後進行篩選分類輸出。
DECLARE CURSOR emp_cursor IS SELECT SNO,SNAME,GRADE FROM cs; BEGIN FOR CS_record IN emp_cursor LOOP IF CS_RECORD.GRADE>=90 THEN DBMS_OUTPUT.PUT_LINE('90分以上的人'||CS_record.SNO|| CS_record.Sname); ELSIF CS_RECORD.GRADE>=80 AND CS_RECORD.GRADE<90 THEN DBMS_OUTPUT.PUT_LINE('80-90的人'||CS_record.SNO|| CS_record.Sname); ELSIF CS_RECORD.GRADE>=70 AND CS_RECORD.GRADE<80 THEN DBMS_OUTPUT.PUT_LINE('70-80的人'||CS_record.SNO|| CS_record.Sname); ELSIF CS_RECORD.GRADE>=60 AND CS_RECORD.GRADE<70 THEN DBMS_OUTPUT.PUT_LINE('60-70的人'||CS_record.SNO|| CS_record.Sname); ELSE DBMS_OUTPUT.PUT_LINE('60分以下的人'||CS_record.SNO|| CS_record.Sname); END IF; END LOOP; END;
2、隱式遊標 一次只能讀取一行資料,如select 系統自動完成
如DML操作,和單行select語句,隱式遊標可以通過遊標的屬性來了解當前操作的結果。訪問:通過名字sql來訪問,每次只能訪問前面的一個操作遊標屬性。
SQL%ROWCOUNT 返回成功執行的資料行數
SQL%FOUND 操作是否成功
SQL%NOTFOUND 與上面的相反
SQL%ISOPEN 判斷sql語句是否結束,正在執行為true,結束為false
BEGIN
UPDATE emp SET sage=sage+100 WHERE e#=1234;
IF SQL%FOUND THEN --隱式遊標可以通過遊標的屬性來了解當前操作的結果。
DBMS_OUTPUT.PUT_LINE('成功修改僱員工資!');
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('修改僱員工資失敗!');
END IF;
END;
子程式