1. 程式人生 > >Oracle 中游標的使用方法練習(自我心得)

Oracle 中游標的使用方法練習(自我心得)

遊標是一個記憶體工作區,將資料庫中讀取的東西放入快取中,不需要反覆讀取資料庫。

我的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;  


子程式