Oracle中cursor學習

參考文章:Oracle中Cursor介紹和使用

什麼是cursor

好吧,我也沒有他的定義,網上找也沒找到,若有大俠有比較好的解釋還請不吝賜教。

說說現在的理解吧:cursor遊標,和它對應java中的對象是ResultSet,可以理解爲一個map的數組,或者說想json數組,感覺應該是長這樣的

{
    {name:'張三',sex:'男',age:20},
    {name:'李四',sex:'女',age:18}
}

簡單用法

declare 
  cursor mycur is 
  select t_user.user_name,t_user.user_sex,t_user.user_age from t_user;
begin
   for i in mycur 
     loop 
     Dbms_Output.put_line('姓名:'||i.user_name||'性別:'||i.user_sex||' 年齡:'||i.user_age);
   end loop;
  exception
     when others then
     dbms_output.put_line(sqlerrm);  
end; 

再看一例子

DECLARE
  CURSOR emp_cur IS
    SELECT employee_id 
      FROM employees
     WHERE salary > 3000
           AND job_id = 'ST_CLERK'
       FOR UPDATE OF salary NOWAIT;
  c_row NUMBER;
BEGIN
  IF NOT emp_cur%ISOPEN THEN
    OPEN emp_cur;
  END IF;
  LOOP
    FETCH emp_cur
      INTO c_row;
    EXIT WHEN emp_cur%NOTFOUND;
    UPDATE employees SET salary = salary * 1.1 WHERE CURRENT OF emp_cur;
  END LOOP;
  COMMIT;
  dbms_output.put_line('update complete');
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
    ROLLBACK;
end;

參數:在使用遊標的時候,遊標會產生四個屬性:%found、%notfound、%isopen 和%rowcount,下面以隱式遊標爲例來看下游標屬性的使用方法。


BEGIN
  --update 語句會產生一個遊標,我們會獲取到相應的遊標屬性
  UPDATE cux_cursor_test t SET t.age = 30 WHERE t.person_name = 'Herry';
  IF SQL%FOUND THEN
    dbms_output.put_line('Herry 更新了幾條記錄:' || SQL%ROWCOUNT);
  ELSIF SQL%NOTFOUND THEN
    dbms_output.put_line('Herry 在表中不存在');
  END IF;
  --delete 語句會產生一個遊標,我們會獲取到相應的遊標屬性
  DELETE cux_cursor_test p WHERE p.person_name = 'Abc';
  IF SQL%FOUND THEN
    dbms_output.put_line('Abc 刪除了幾條記錄' || SQL%ROWCOUNT);
  ELSIF SQL%NOTFOUND THEN
    dbms_output.put_line('Abc 在表中不存在');
  END IF;
  --insert 語句會產生一個遊標,我們會獲取到相應的遊標屬性
  INSERT INTO cux_cursor_test
  VALUES
    (103,
     'Peter',
     28);
  IF SQL%FOUND THEN
    dbms_output.put_line('Peter 插入了幾條記錄:' || SQL%ROWCOUNT);
  ELSIF SQL%NOTFOUND THEN
    dbms_output.put_line('無數據可以插入');
  END IF;
END;

%rowcount r它隨每次fetch而累計:

參考文章

%notfound:It returns TRUE if an INSERTUPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise, it returns FALSE.

參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章