實例詳解資料庫的游標管理

来源:https://www.cnblogs.com/huaweiyun/p/18033725
-Advertisement-
Play Games

本文分享自華為雲社區《GaussDB資料庫SQL系列-游標管理》,作者:酷哥。 一、前言 在資料庫中,游標(cursor)是一種非常重要的工具,用於在資料庫查詢結果集中進行定位和操作。游標提供了一種在多行數據結果集中逐行處理每一行的機制,允許開發人員對每一行的數據進行操作,如檢索、過濾、修改等。本文 ...


本文分享自華為雲社區《GaussDB資料庫SQL系列-游標管理》,作者:酷哥。

一、前言

在資料庫中,游標(cursor)是一種非常重要的工具,用於在資料庫查詢結果集中進行定位和操作。游標提供了一種在多行數據結果集中逐行處理每一行的機制,允許開發人員對每一行的數據進行操作,如檢索、過濾、修改等。本文將結合GaussDB資料庫,簡單的給大家做一介紹。

二、概述(GaussDB)

1、游標概述

在GaussDB資料庫中,為了處理SQL語句,存儲過程進程分配一段記憶體區域來保存上下文聯繫。游標是指向上下文區域的句柄或指針。藉助游標,存儲過程可以控制上下文區域的變化。

2、游標的使用分類

游標的使用分為顯式游標和隱式游標。對於不同的SQL語句,游標的使用情況不同。

序號

SQL語句

游標

1

結果是多行的查詢語句

顯式的

2

非查詢語句

隱式的

3

結果是單行的查詢語句

隱式 / 顯式

• 顯式游標:顯式游標主要用於對查詢語句的處理,尤其是在查詢結果為多條記錄的情況下。

• 隱式游標:對於非查詢語句,如修改、刪除操作,則由系統自動地為這些操作設置游標並創建其工作區,這些由系統隱含創建的游標稱為隱式游標,隱式游標的名稱為SQL,這是由系統定義的。

• 游標迴圈:游標在WHILE語句、LOOP語句中的使用稱為游標迴圈,一般這種迴圈都需要使用OPEN、FETCH和CLOSE語句。

三、GaussDB中的顯式游標(示例)

1、顯式游標的使用與操作步驟

• 第一步定義(聲明)游標:定義一個游標名,以及與其相對應的SELECT語句。

• 第二步打開游標:執行游標所對應的SELECT語句,將其查詢結果放入工作區,並且指針指向工作區的首部,標識游標結果集合。如果游標查詢語句中帶有FOR UPDATE選項,OPEN語句還將鎖定資料庫表中游標結果集合對應的數據行。

• 第三步提取游標數據:檢索結果集合中的數據行,放入指定的輸出變數中。

• 第四步,對該記錄進行處理。

• 第五步,繼續處理,直到活動集合中沒有記錄。

• 第六步關閉游標:當提取和處理完游標結果集合數據後,應及時關閉游標,以釋放該游標所占用的系統資源,並使該游標的工作區變成無效,不能再使用FETCH語句獲取其中數據。關閉後的游標可以使用OPEN語句重新打開。

2、顯式游標示例

--給工資大於等於20000的員工降薪500。

--複製一張測試表

CREATE TABLE company2 AS TABLE company1;
CREATE OR REPLACE PROCEDURE cursor_p()

AS

DECLARE

v_id NUMBER(6);

v_salary NUMBER(8,2);

CURSOR c1 IS SELECT id, salary FROM company2;

BEGIN

OPEN c1;

LOOP

FETCH c1 INTO v_id, v_salary;

EXIT WHEN c1%NOTFOUND;

IF v_salary>=20000 THEN

UPDATE company2 SET salary =salary - 500 WHERE id = v_id;

END IF;

END LOOP;

CLOSE c1;

END;

/
--執行存儲過程

CALL cursor_p();
--查看,比對結果變化

SELECT t2.*,t1.salary as "降薪前" FROM company2 t2 LEFT JOIN company1 t1 ON t2.id=t1.id ORDER BY ID ASC;

游標屬性說明

%NOTFOUND是游標的屬性之一,用於控製程序流程或者瞭解程式的狀態。此處的意思是,當最近的DML(數據操作語言)操作(如INSERT,UPDATE,DELETE等)沒有影響任何行時,該屬性為真。也就是說,如果對錶執行的操作沒有找到任何匹配的行,那麼這個屬性就會為真,'EXIT WHEN c1%NOTFOUND;' 就會執行。

執行結果

四、GaussDB中的隱式游標(示例)

1、隱式游標簡介

對於隱式游標的操作,如定義、打開、取值及關閉操作,都由系統自動地完成,無需用戶進行處理。用戶只能通過隱式游標的相關屬性,來完成相應的操作。在隱式游標的工作區中,所存放的數據是最新處理的一條SQL語句所包含的數據,與用戶自定義的顯式游標無關。

2、隱式游標示例

--創建臨時表,刪除已離職的員工Allen,如果Allen已經不存在,則新增一條新員工信息(重名)

CREATE TABLE company3 AS TABLE company1;
CREATE OR REPLACE PROCEDURE cursor_p1()

AS

DECLARE

v_name VARCHAR(10) := 'Allen';

BEGIN

     DELETE FROM company3 WHERE name = v_name;

--根據游標狀態做進一步處理

IF SQL%NOTFOUND THEN

INSERT INTO company3 VALUES(4,v_name,24,'China',30000);

END IF;

END;

/
--執行

CALL cursor_p1();
--查看,比對執行結果

SELECT *, 'company1' as "company1" FROM company1 WHERE NAME ='Allen'

union all

SELECT *, 'company3' as "company3" FROM company3 WHERE NAME ='Allen'

游標屬性說明

SQL%NOTFOUND 是GaussDB資料庫中的一個屬性,用於檢查最近的 SQL 語句是否對資料庫沒有任何影響。如果 SQL 語句沒有找到任何匹配的記錄,那麼這個屬性就為真。所以,本段SQL中的IF SQL%NOTFOUND THEN 這一行代碼的意思是:如果最近的 SQL 語句沒有找到任何匹配的記錄,那麼就執行後續的代碼。通常,這個語句用於處理 SQL 查詢可能找不到數據的情況。

執行結果

五、小結

在GaussDB資料庫中,游標主要用於執行複雜的查詢語句、處理多行數據以及進行數據操作等場景。游標的使用可以提高程式的靈活性和可維護性,並且可以減少不必要的記憶體消耗。使用游標,開發人員可以靈活地控制查詢結果集的遍歷順序和處理方式,以滿足不同的業務需求。

 

點擊關註,第一時間瞭解華為雲新鮮技術~

 


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

-Advertisement-
Play Games
更多相關文章
  • 一:背景 1. 講故事 過年喝了不少酒,腦子不靈光了,停了將近一個月沒寫博客,今天就當新年開工寫一篇吧。 去年年初有位朋友找到我,說他們的系統會偶發性崩潰,在網上也發了不少帖子求助,沒找到自己滿意的答案,讓我看看有沒有什麼線索,看樣子這是一個牛皮蘚的問題,既然對方有了dump,那就分析起來吧。 二: ...
  • 好久不見,我又回來了。 給大家分享一個我最近使用c#代碼操作ftp伺服器的代碼示例: 1 public abstract class FtpOperation 2 { 3 /// <summary> 4 /// FTP伺服器地址 5 /// </summary> 6 private string f ...
  • 最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執行效率。那麼 1=1 存在什麼樣的問題呢?為什麼又會使用呢? ...
  • 背景 在瀏覽器中訪問本地靜態資源html網頁時,可能會遇到跨域問題如圖。 是因為瀏覽器預設啟用了同源策略,即只允許載入與當前網頁具有相同源(協議、功能變數名稱和埠)的內容。 WebView2預設情況下啟用了瀏覽器的同源策略,即只允許載入與主機相同源的內容。所以如果我們把靜態資源發佈到iis或者通過node ...
  • 1、calc:啟動計算器 2、appwiz.cpl:程式和功能 3、certmgr.msc:證書管理實用程式 4、charmap:啟動字元映射表 5、chkdsk.exe:Chkdsk磁碟檢查(管理員身份運行命令提示符) 6、cleanmgr: 打開磁碟清理工具 7、cliconfg:SQL SER ...
  • 迪文屏TA指令開發_開機動畫 1. 新建項目 新建一個空白文件夾,點擊新建工程之後選擇新建文件夾地址即可 創建完成之後,文件夾結構如下: 2. 導入背景圖片素材 說是設置開機動畫,實際上是通過多個背景圖片的連續播放實現的動畫效果 點擊加號鍵,可以直接選中所有的背景圖片素材進行一鍵導入 3. 設置控制項 ...
  • 介紹 Windows Server 2025 為 Hyper-V 帶來了多項增強功能和新的存儲特性,主要用於優化虛擬機的運行體驗。這些新特性涵蓋 GPU 虛擬化、新的 ReFS 去重功能,以及在非 AD 域的集群上進行虛擬機實時遷移。 雲桌面方案的用戶最關心的GPU-P的技術也將在Windows S ...
  • 背景 在GreatSQL主從複製環境中,有時候可能會出現一些誤操作,將本應該寫入到主庫的數據寫入到了從庫,導致主從數據不一致,影響數據同步。是否可以將寫入從庫的數據同步寫入主庫呢? 測試環境 角色 IP地址 資料庫開放埠 版本 主庫 192.168.137.179 3308 GreatSQL 8. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...