婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Oracle游標的使用實例詳解

Oracle游標的使用實例詳解

熱門標簽:海南400電話哪里辦理 呼倫貝爾智能手機地圖標注 南寧人工智能電銷機器人費用 安陽外呼系統免費 濟南地圖標注公司 分布式呼叫中心 圖像地圖標注 貴陽電話外呼系統哪家好 400電話是不是免費申請

什么是游標?

①從表中檢索出結果集,從中每次指向一條記錄進行交互的機制。

②關系數據庫中的操作是在完整的行集合上執行的。

由 SELECT 語句返回的行集合包括滿足該語句的 WHERE 子句所列條件的所有行。由該語句返回完整的行集合叫做結果集。

應用程序,尤其是互動和在線應用程序,把完整的結果集作為一個單元處理并不總是有效的。

這些應用程序需要一種機制來一次處理一行或連續的幾行。而游標是對提供這一機制的結果集的擴展。

游標是通過游標庫來實現的。游標庫是常常作為數據庫系統或數據訪問 API 的一部分而得以實現的軟件,用來管理從數據源返回的數據的屬性(結果集)。這些屬性包括并發管理、在結果集中的位置、返回的行數,以及是否能夠在結果集中向前和/或向后移動(可滾動性)。

游標跟蹤結果集中的位置,并允許對結果集逐行執行多個操作,在這個過程中可能返回至原始表,也可能不返回至原始表。

換句話說,游標從概念上講基于數據庫的表返回結果集。

由于它指示結果集中的當前位置 ,就像計算機屏幕上的光標指示當前位置一樣,“游標”由此得名。

游標有什么作用?

①指定結果集中特定行的位置。

②基于當前的結果集位置檢索一行或連續的幾行。

③在結果集的當前位置修改行中的數據。

④對其他用戶所做的數據更改定義不同的敏感性級別。

⑤可以以編程的方式訪問數據庫。

引言

本節對Oracle中的游標進行詳細講解。本節所舉實例來源Oracle中scott用戶下的emp表dept表:

一、游標:

1、概念:

游標的本質是一個結果集resultset,主要用來臨時存儲從數據庫中提取出來的數據塊。

二、游標的分類:

1、顯式游標:

由用戶定義,需要的操作:定義游標、打開游標、提取數據、關閉游標,主要用于對查詢語句的處理。

屬性:%FOUND %NOTFOUND %ISOPEN %ROWCOUNT

Example:打印emp表的員工信息

DECLARE
 CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
 v_empno emp.empno%TYPE;
 v_name emp.ename%TYPE;
 v_job emp.job%TYPE;
BEGIN
 OPEN emp_cursor;
 LOOP
 FETCH emp_cursor INTO v_empno,v_name,v_job;
 DBMS_OUTPUT.PUT_LINE('員工號為:'||v_empno||'姓名是'||v_name||'職位:'||v_job);
 EXIT WHEN emp_cursor%NOTFOUND;
 END LOOP;
 CLOSE emp_cursor;
END;

這里嚴格按照顯示游標的書寫規則:DECLARE emp_cursor定義游標OPEN emp_cursor打開游標FETCH emp_cursor INTO...提取數據CLOSE emp_cursor關閉游標,因為提取出來的數據屬于多行,所以通過loop循環打印即可。

Example2:檢驗游標是否打開,如果打開顯示提取行數

DECLARE
 CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
 v_empno emp.empno%TYPE;
 v_name emp.ename%TYPE;
 v_job emp.job%TYPE;
BEGIN
 OPEN emp_cursor;
 LOOP
  FETCH emp_cursor INTO v_empno,v_name,v_job;
  EXIT WHEN emp_cursor%NOTFOUND;
 END LOOP;
 IF emp_cursor%ISOPEN THEN
 DBMS_OUTPUT.PUT_LINE('游標已打開');
 DBMS_OUTPUT.PUT_LINE('讀取了'||emp_cursor%ROWCOUNT||'行');
 ELSE
 DBMS_OUTPUT.PUT_LINE('游標沒有打開');
 END IF; 
 CLOSE emp_cursor;
END;

通過%ISOPEN屬性判斷游標是否打開,%ROWCOUNT判斷獲取行數。

2、隱式游標:由系統定義并為它創建工作區域,并且隱式的定義打開提取關閉,隱式游標的游標名就是'SQL',屬性和顯示游標相同,主要用于對單行select語句或dml操作進行處理。Example:又用戶輸入員工號修改員工工資如成功則打印輸出成功標志。

為了盡量不改變原表,創建新表emp_new和原表數據相同:

CREATE TABLE emp_new
AS
SELECT * FROM emp;
BEGIN
 UPDATE emp_new SET sal = sal+500 WHERE empno=empno;
 IF SQL%FOUND THEN
 DBMS_OUTPUT.PUT_LINE('成功修改');
 COMMIT;
 ELSE
 DBMS_OUTPUT.PUT_LINE('修改失敗');
 ROLLBACK;
 END IF;
END;

這里注意增刪改以后要對做的操作進行commit提交,如果操作失敗則rollback回滾剛才的操作。

3、參數游標:

在定義游標時加入參數的游標,可以配合游標for循環快速找到需要的數據。這里先講一下游標for循環

A、游標FOR循環:

隱含的執行了打開提取關閉數據,代碼精簡很多。Expression:

FOR table_record IN table_cursor LOOP

  STATEMENT;

END LOOP;

Example:使用游標For循環打印輸出員工信息:

DECLARE
CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
BEGIN
 FOR emp_record IN emp_cursor LOOP
 DBMS_OUTPUT.PUT_LINE('員工號:'||emp_record.empno||'員工姓名'||emp_record.ename||'員工職位'||emp_record.job);
 END LOOP;
END;

這里游標FOR循環省去了對于取到的數據的變量的命名和賦值,同時如果全部打印則不用寫循環條件,代碼精簡了很多。

如果想讓代碼更加精簡,則可以去掉對游標的聲明引入子查詢即可,操作如下。

BEGIN
 FOR emp_record IN (SELECT empno,ename,job FROM emp) LOOP
 DBMS_OUTPUT.PUT_LINE('員工號:'||emp_record.empno||'員工姓名'||emp_record.ename||'員工職位'||emp_record.job);
 END LOOP;
END;

代碼更加精簡,得到的結果相同。和隱式游標是不是有點像,但隱式游標主要用于的是單行select和dml語句的操作,注意2者用法的區別。

下面繼續參數游標的實例:

Example:輸入部門號打印員工信息:

DECLARE
CURSOR emp_cursor(dno NUMBER)IS SELECT empno,ename,job FROM emp WHERE deptno=dno;
BEGIN
 FOR emp_record IN emp_cursor(dno) LOOP
 DBMS_OUTPUT.PUT_LINE('員工號'||emp_record.empno||'姓名'||emp_record.ename||'職位'||emp_record.job);
 END LOOP;
END;

這里既然有參數,那么必然會有對游標的聲明,在結合游標FOR循環快速超找所需要的數據。

三、使用游標修改數據的注意事項

1、使用游標修改數據時,為防止他人在自己操作數據時對數據進行修改,oracle提供for update子句進行加鎖。

同時在你使用update或delete時,必須使用where current of+name_cursor語句,以及在最后記得提交。如果是級聯操作則可以使用for update of 來進行相關表的加鎖。

Example1:對職位是PRESIDENT的員工加1000工資,MANAGER的人加500工資

CREATE TABLE emp_new
AS
SELECT * FROM emp;
DECLARE
CURSOR empnew_cursor IS SELECT ename,job FROM emp_new FOR UPDATE;
BEGIN
 FOR empnew_record IN empnew_cursor LOOP
 DBMS_OUTPUT.PUT_LINE('姓名'||empnew_record.ename||'職位'||empnew_record.job);
 IF empnew_record.job='PRESIDENT' THEN
  UPDATE emp_new SET sal=sal+1000 WHERE CURRENT OF empnew_cursor;
 ELSIF empnew_record.job='MANAGER' THEN
  UPDATE emp_new SET sal=sal+500 WHERE CURRENT OF empnew_cursor;
 END IF;
 END LOOP;
 COMMIT;
END;

可以看到這里工資有了相應的變化。至此,Oracle游標解析完畢,總而言之,游標只是作為我們從數據庫中提取出來的一部分數據,我們針對這個結果集做一系列的操作。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 詳解Oracle游標的簡易用法
  • Oracle中游標Cursor基本用法詳解
  • 詳解Oracle隱式游標和顯式游標
  • Oracle中的游標和函數詳解
  • Oracle出現超出打開游標最大數的解決方法
  • Oracle顯示游標的使用及游標for循環
  • Oracle存儲過程返回游標實例詳解
  • Oracle 游標使用總結
  • oracle 在一個存儲過程中調用另一個返回游標的存儲過程
  • Oracle游標使用參考語句實例解析

標簽:遼源 涼山 滁州 郴州 焦作 許昌 南充 合肥

巨人網絡通訊聲明:本文標題《Oracle游標的使用實例詳解》,本文關鍵詞  Oracle,游,標的,使用,實例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle游標的使用實例詳解》相關的同類信息!
  • 本頁收集關于Oracle游標的使用實例詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 遵义市| 桂平市| 新营市| 松原市| 额尔古纳市| 吉隆县| 宿州市| 普兰店市| 江门市| 界首市| 油尖旺区| 平利县| 申扎县| 紫金县| 乌什县| 方城县| 根河市| 汝南县| 禄丰县| 南陵县| 海南省| 丹棱县| 石首市| 洛扎县| 宾川县| 龙门县| 泗阳县| 新乐市| 陆川县| 闻喜县| 鹤岗市| 金堂县| 新平| 平乐县| 阜平县| 大埔县| 大冶市| 镇雄县| 揭东县| 荥经县| 张家港市|