oracle基礎之游標的理解與使用

来源:http://www.cnblogs.com/MoreThinking/archive/2017/10/20/7700295.html
-Advertisement-
Play Games

關於游標,首先要知道游標的定義。 游標,是記憶體中的一款區域,用來存放select的結果集 游標用來處理從資料庫中檢索的多行記錄(使用select語句)。利用游標,程式可以逐個的處理和遍歷一次索引返回的整個記錄集。 在資料庫中,存在兩種游標: 一、顯示游標(需要明確定義) 顯示游標被用於處理返回多行數 ...


關於游標,首先要知道游標的定義。

  游標,是記憶體中的一款區域,用來存放select的結果集

  游標用來處理從資料庫中檢索的多行記錄(使用select語句)。利用游標,程式可以逐個的處理和遍歷一次索引返回的整個記錄集。

在資料庫中,存在兩種游標:

一、顯示游標(需要明確定義

    顯示游標被用於處理返回多行數據的select語句,游標名通過CURSOR...IS語句顯示的賦給select語句。

    在PL/SQL中處理顯示游標的四個步驟:

     1)聲明游標:CURSOR   IS select語句

     2)為查詢打開游標: OPEN 游標名稱

     3) 取得結果放入PL/SQL變數中:

         FETCH 游標名稱 INTO list_of_variables;

                  FETCH  游標名稱     INTO PL/SQL_record;

     4)關閉游標:CLOSE 游標名稱

     註意:在聲明游標時, select語句不能包含INTO子句。當使用顯示游標時,INTO子句是FETCH語句的一部分。

二、隱式游標 
       所有的隱式游標都被假設為只返回一條記錄。
       使用隱式游標時,用戶無需進行聲明、打開及關閉。PL/SQL隱含地打開、處理,然後關掉游標。
       例如:
       …….

       SELECT studentNo,studentName

       INTO curStudentNo,curStudentName

       FROM StudentRecord

       WHERE name=’gg’;

       上述游標自動打開,並把相關值賦給對應變數,然後關閉。執行完後,PL/SQL變數curStudentNo,curStudentName中已經有了值。
   2、 隱式游標
     單條sql語句所產生的結果集合 
       用關鍵字SQL表示隱式游標
        4個屬性 %rowcount  影響的記錄的行數  整數
                %found     影響到了記錄 true
                %notfound  沒有影響到記錄 true
                %isopen    是否打開  布爾值 永遠是false
         多條sql語句 隱式游標SQL永遠指的是最後一條sql語句的結果
         主要使用在update 和 delete語句上      


實際操作和例子:

   (1)FOR迴圈游標 (常用的一種游標)

 --<1>定義游標
 --<2>定義游標變數
 --<3>使用for迴圈來使用這個游標

  --前向游標 只能往一個方向走
  --效率很高
      declare
        --類型定義
        cursor cc is select empno,ename,job,sal
         from emp where job = 'MANAGER';
        --定義一個游標變數
        ccrec cc%rowtype;
      begin
         --for迴圈
         for ccrec in cc loop
            dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
         end loop;       
      end;
   (2) fetch游標
     --使用的時候 必須要明確的打開和關閉
      declare
        --類型定義
        cursor cc is select empno,ename,job,sal
         from emp where job = 'MANAGER';
        --定義一個游標變數
        ccrec cc%rowtype;
      begin
        --打開游標
         open cc;
        --loop迴圈
         loop
            --提取一行數據到ccrec中 
            fetch cc into ccrec;         
            --判斷是否提取到值,沒取到值就退出
            --取到值cc%notfound 是false
            --取不到值cc%notfound 是true 
            exit when cc%notfound;
            dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);            
         end loop; 
        --關閉游標
         close cc;  
      end;
  游標的屬性4種
       %notfound  fetch是否提到數據 沒有true 提到false
       %found      fetch是否提到數據 有true 沒提到false
       %rowcount  已經取出的記錄的條數
       %isopen    布爾值 游標是否打開
   (3)參數游標
 按部門編號的順序輸出部門經理的名字
     declare
       --部門
       cursor c1 is select deptno from dept;
       --參數游標c2,定義參數的時候
       --只能指定類型,不能指定長度  
       --參數只能出現在select語句=號的右側
       cursor c2(no number,pjob varchar2) is select emp.* from emp
         where deptno = no and job=pjob;
       c1rec c1%rowtype;
       c2rec c2%rowtype;
       --定義變數的時候要指定長度
       v_job varchar2(20);
     begin
       --部門
        for c1rec in c1 loop
          --參數在游標中使用
          for c2rec in c2(c1rec.deptno,'MANAGER') loop
            dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
          end loop; 
        end loop; 
     end; 
  (4)引用游標/動態游標
       -- select語句是動態的
     declare
       --定義一個類型(ref cursor)弱類型    
       type cur is ref cursor;
         --強類型(返回的結果集有要求)
       type cur1 is ref cursor return emp%rowtype;
       --定義一個ref cursor類型的變數   
       cura cur;
       c1rec emp%rowtype;
       c2rec dept%rowtype;
     begin
  DBMS_output.put_line('輸出員工')   ;       
       open cura for select * from emp;
       loop
         fetch cura into c1rec;   
         exit when cura%notfound;
         DBMS_output.put_line(c1rec.ename)   ;
       end loop ;
  DBMS_output.put_line('輸出部門')   ;
       open cura for select * from dept;
       loop
         fetch cura into c2rec;   
         exit when cura%notfound;
         DBMS_output.put_line(c2rec.dname)   ;
       end loop;  
       close cura;
    end;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近公司有了一個新的需求,學生在購買課時的時候,需要讓家長或者朋友代付。這樣的話我首先想到的就是微信的H5支付(微信內置瀏覽器調用支付模塊)。當時想用這個支付的原因因為是前端代碼十分簡單。。 然而恰恰是因為自己選擇了這個方法,讓自己連續兩天陷入了困境。 下麵是正文跟代碼截圖 首先咱們先來看下H5的支 ...
  • 第一種方法:通過設置layer的屬性 最簡單的一種,但是很影響性能,一般在正常的開發中使用很少. ? 1 2 3 4 5 6 7 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, ...
  • 引言 為了後面的例子做準備,本篇及接下來幾篇將介紹Android應用程式的原理及術語,這些也是作為一個Android的開發人員必須要瞭解,且深刻理解的東西。本篇的主題如下: 1、應用程式基礎 2、應用程式組件 2.1、活動(Activities) 2.2、服務(Services) 2.3、廣播接收者 ...
  • ——工欲善其事必先利其器 引言 本系列適合0基礎的人員,因為我就是從0開始的,此系列記錄我步入Android開發的一些經驗分享,望與君共勉!作為Android隊伍中的一個新人的我,如果有什麼不對的地方,還望不吝賜教。 在開始Android開發之旅啟動之前,首先要搭建環境,然後創建一個簡單的Hello ...
  • 一:理解sql執行順序 在sql中,第一個被執行的是from語句,每一個步驟都會產生一個虛擬表,該表供下一個步驟查詢時調用,比如語句:select top 10 column1,colum2,max(column3) from user where id>1 group by column1,col ...
  • [TOC] 一、Mongodb 的許可權管理 認識許可權管理,說明主要概念及關係 與大多數資料庫一樣,Mongodb同樣提供了一套許可權管理機制。 為了體驗Mongodb 的許可權管理,我們找一臺已經安裝好的Mongodb,可以 "參照這裡" 搭建一個單節點的Mongodb。 直接打開mongo shell ...
  • 資料庫連接池 本詞條由“科普中國”百科科學詞條編寫與應用工作項目 審核 。 本詞條由“科普中國”百科科學詞條編寫與應用工作項目 審核 。 資料庫連接池負責分配、管理和釋放資料庫連接,它允許應用程式重覆使用一個現有的資料庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒 ...
  • 一、Oracle 中的分頁 1) select * from emp; 2)select * ,rownum from emp; //這樣寫不行 3)select ename,job,sal,rownum from emp; //可以 ENAME JOB SAL ROWNUM SMITH CLERK ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...