達夢數據庫中插入導出圖片的方法與應用

達夢數據庫中插入導出圖片的方法與應用

在數據庫的實際應用場景中,圖片存儲是一項常見且重要的需求。以電商平臺為例,商品展示圖片是吸引消費者的關鍵元素;而在社交軟件里,用戶頭像更是個人形象的直觀體現。針對達夢數據庫,業界常用的圖片存儲策略主要分為兩大類。
第一種策略是將圖片存儲于磁盤,數據庫字段僅記錄圖片路徑。這種方式的顯著優勢在于減輕了數據庫的存儲壓力,因為數據庫無需直接處理圖片的二進制數據。然而,它存在明顯的局限性,一旦圖片存儲路徑發生變更,或者存儲磁盤出現故障,數據庫應用在調用圖片時就可能遭遇加載失敗的問題。例如,若存儲圖片的磁盤分區因硬件故障損壞,依賴該路徑的應用程序將無法正常顯示相關圖片。
第二種策略是將圖片以二進制形式直接存儲于數據庫。達夢數據庫采用這種方式,并支持使用 blob 或 bfile 類型的字段進行存儲。這種策略的優勢在于保障了數據的完整性和一致性,圖片數據與其他相關數據集中存儲于數據庫,便于統一管理和維護。但高分辨率圖片的二進制數據量往往較大,會顯著增加數據庫的存儲負擔。
接下來,詳細介紹在 達夢數據庫中利用這兩種策略插入圖片的具體操作方法。

一、使用 disql 插入圖片

創建表
在插入圖片前,需創建相應的表結構,特別要注意將用于存儲圖片的列定義為 BLOB 類型。具體操作如下:

DROP TABLE IMAGE_LOB;
CREATE TABLE IMAGE_LOB (T_ID INT NOT NULL,T_IMAGE BLOB NOT NULL,PRIMARY KEY(T_ID)
);

在此表結構中,T_ID 作為主鍵,用于唯一標識每一條記錄;T_IMAGE 列則專門用于存儲圖片的二進制數據。
執行插入語句
打開 disql 工具后,可通過執行以下語句完成圖片插入操作:

@INSERT INTO IMAGE_LOB VALUES(1,@'F:\PIC\test.png');
COMMIT;

上述語句將位于F:\PIC\路徑下的test.png圖片插入到 IMAGE_LOB 表中,對應的記錄 ID 為 1。

二、通過 manager 調用系統包插入圖片

創建表
同樣,首先要創建表,并且將插入圖片的列定義為 BLOB 類型,操作語句與使用 disql 創建表時一致:

DROP TABLE IMAGE_LOB;
CREATE TABLE IMAGE_LOB (T_ID INT NOT NULL,T_IMAGE BLOB NOT NULL,PRIMARY KEY(T_ID)
);

創建圖片存放目錄
需要創建一個虛擬路徑目錄,用于存放待插入到表中的圖片。例如:

CREATE OR REPLACE DIRECTORY "IMAGES" AS 'F:\PIC';

此語句創建了一個名為 “IMAGES” 的虛擬目錄,其實際指向的物理路徑為F:\PIC。
創建存儲過程
接下來創建一個存儲過程,用于實現圖片插入操作。其中,FILENAME參數為圖片文件名,例如’test.png’。

CREATE OR REPLACE PROCEDURE IMG_INSERT(TID INT,FILENAME VARCHAR(200)
) ASF_LOB BFILE;B_LOB BLOB;
BEGININSERT INTO IMAGE_LOB (T_ID, T_IMAGE) VALUES (TID,EMPTY_BLOB()) RETURN T_IMAGE INTO B_LOB;F_LOB:= BFILENAME ('IMAGES', FILENAME);DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB, DBMS_LOB.GETLENGTH (F_LOB));DBMS_LOB.FILECLOSE (F_LOB);COMMIT;
END;

在這個存儲過程中,首先向 IMAGE_LOB 表中插入一條記錄,其中圖片字段先使用EMPTY_BLOB()占位。然后通過BFILENAME函數獲取圖片文件路徑,接著以只讀方式打開文件,并將文件內容加載到 BLOB 字段中,最后關閉文件并提交事務。
執行存儲過程
執行上述創建的存儲過程,即可實現圖片插入操作。例如:

CALL IMG_INSERT(1,'test.png');

這條語句會將test.png圖片插入到 IMAGE_LOB 表中,對應的記錄 ID 為 1。
查看表
插入完成后,可通過以下語句查看表中的數據:

SELECT * FROM IMAGE_LOB;

執行該查詢語句后,可看到表中已成功插入圖片相關記錄,其中圖片字段顯示為二進制數據。


在達夢數據庫實際應用場景里,不僅會有往數據庫表中插入圖片的需求,有時也需要從數據庫表中導出圖片。下面將詳細介紹在達夢數據庫中導出圖片的具體方法。

三、創建圖片導出目錄

在數據庫中定義一個虛擬目錄,用于指定圖片導出的本地路徑。執行以下SQL語句:

--定義本地圖片導出目錄
CREATE OR REPLACE DIRECTORY "IMAGES" AS 'D:\vm\FIC';

上述語句中,CREATE OR REPLACE DIRECTORY用于創建或替換一個目錄對象,將名為IMAGES的虛擬目錄映射到本地路徑D:\vm\FIC。這個路徑是本地實際存在的目錄,用于存放導出的圖片。

四、創建導出圖片的存儲過程

通過創建存儲過程來實現從指定表中根據記錄ID導出圖片到之前定義的目錄中。

--導出圖片到本地dir
CREATE OR REPLACE PROCEDURE DUMP_IMAGE_TO_DIR(IN_TABLE_NAME VARCHAR2(1000),  IN_ID          INT)
ISL_FILE UTL_FILE.FILE_TYPE;L_BUFFER RAW (32767);L_AMOUNT BINARY_INTEGER := 32767;L_POS INTEGER           := 1;L_BLOB BLOB;L_BLOB_LEN INTEGER;L_SQL      VARCHAR2(1000);
BEGINL_SQL := 'SELECT T_IMAGE FROM ' || IN_TABLE_NAME || ' WHERE T_ID = :1';EXECUTE IMMEDIATE L_SQL INTO L_BLOB USING IN_ID;L_BLOB_LEN := DBMS_LOB.GETLENGTH (L_BLOB);L_FILE     := UTL_FILE.FOPEN ('IMAGES',IN_ID||'.JPG', 'WB', 32767);WHILE L_POS < L_BLOB_LENLOOPIF L_POS + L_AMOUNT -1 > L_BLOB_LEN THENL_AMOUNT := L_BLOB_LEN - L_POS + 1;END IF;DBMS_LOB.READ ( L_BLOB, L_AMOUNT, L_POS, L_BUFFER );UTL_FILE.PUT_RAW ( L_FILE, L_BUFFER, TRUE );L_POS := L_POS + L_AMOUNT;END LOOP;UTL_FILE.FCLOSE (L_FILE);
EXCEPTION
WHEN OTHERS THENIF UTL_FILE.IS_OPEN (L_FILE) THENUTL_FILE.FCLOSE (L_FILE);END IF;RAISE;
END DUMP_IMAGE_TO_DIR;
  1. 參數說明
    • IN_TABLE_NAME:要從中導出圖片的表名,數據類型為VARCHAR2(1000)
    • IN_ID:對應表中圖片記錄的ID,數據類型為INT
  2. 變量定義
    • L_FILE:用于表示文件句柄,數據類型為UTL_FILE.FILE_TYPE
    • L_BUFFER:定義一個RAW類型的緩沖區,大小為32767字節,用于臨時存儲從BLOB字段中讀取的數據。
    • L_AMOUNT:每次從BLOB字段讀取數據的長度,初始值為32767字節,數據類型為BINARY_INTEGER
    • L_POS:記錄當前讀取數據在BLOB字段中的位置,初始值為1,數據類型為INTEGER
    • L_BLOB:用于存儲從表中查詢出來的圖片數據(BLOB類型)。
    • L_BLOB_LEN:存儲BLOB字段的長度,數據類型為INTEGER
    • L_SQL:用于構建動態SQL語句,數據類型為VARCHAR2(1000)
  3. 主要邏輯
    • 構建動態SQL語句,根據傳入的表名和ID查詢對應的圖片數據(BLOB類型)。
    • 使用DBMS_LOB.GETLENGTH獲取BLOB數據的長度。
    • 使用UTL_FILE.FOPEN打開一個文件,文件名為傳入的ID加上.JPG后綴,路徑為之前定義的IMAGES虛擬目錄對應的本地路徑,以二進制寫模式打開。
    • 通過循環讀取BLOB數據,并將讀取的數據寫入文件中。在循環過程中,根據剩余數據長度調整每次讀取的字節數,確保完整讀取BLOB數據。
    • 操作完成后,使用UTL_FILE.FCLOSE關閉文件。
  4. 異常處理
    • 如果在執行過程中發生其他異常,首先檢查文件是否打開,如果打開則關閉文件,然后重新拋出異常,以便上層調用能夠捕獲并處理異常。

五、調用存儲過程導出全表圖片

通過游標遍歷表中所有記錄的ID,調用上述存儲過程實現全表圖片的導出。

--調用導出過程把全表圖片導出
DECLARE CURSOR cur IS SELECT T_ID FROM IMAGE_LOB;
BEGINFOR rec IN cur LOOPDUMP_IMAGE_TO_DIR('IMAGE_LOB',rec.T_ID);END LOOP;
END;
  1. 定義游標:使用CURSOR定義一個游標cur,用于查詢IMAGE_LOB表中的所有T_ID
  2. 循環調用存儲過程:通過FOR循環遍歷游標cur中的每一條記錄,將表名IMAGE_LOB和當前記錄的T_ID作為參數傳遞給DUMP_IMAGE_TO_DIR存儲過程,實現逐張圖片導出到指定目錄。

通過以上步驟,就可以在達夢數據庫中實現從表中導出圖片的功能。在實際操作過程中,請確保相關路徑正確無誤,并且數據庫用戶具有相應的權限,以保證導出操作的順利進行。

綜上所述,在 達夢數據庫中,開發者可依據實際需求和應用場景,靈活選擇使用 disql 或通過 manager 調用系統包的方式插入圖片。以及使用存儲過程的方式導出圖片。不同方式各有優劣,在實際項目中,需綜合考量數據量、性能要求以及管理維護的便捷性等多方面因素,從而確定最適宜的圖片存儲和插入方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【云原生】動態資源分配(DRA)深度洞察報告

1. DRA 的發展與設計靈感 Kubernetes 早期通過 Device Plugin&#xff08;設備插件&#xff09;機制支持 GPU、NIC 等特殊硬件&#xff0c;將節點上可用設備數量上報給 kubelet 和調度器。但設備插件模式存在局限&#xff1a;調度器只能根據節點標簽等屬性粗粒度篩選&#xff…

嵌入式八股ARM篇

前言 ARM篇主要介紹一下寄存器和中斷機制,至于匯編這一塊…還請大家感興趣自行學習 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函數傳參 R4 - R11用來保存程序運算的中間結果或函數的局部變量 在函數調用過程中 注意在發生異常的時候 cortex-M0架構會自動將R0-R3壓入…

Python 實現的采集諸葛靈簽

Python 實現的采集諸葛靈簽 項目介紹 這是一個基于 Python 開發的諸葛靈簽數據采集和展示項目。通過爬蟲技術獲取諸葛神簽的簽文和解簽內容&#xff0c;并提供數據存儲和查詢功能。 項目結構 zhuge/├── zhuge_scraper.py # 爬蟲主程序├── zhuge_pages/ # 數據存儲目錄…

【C++項目實戰】校園公告搜索引擎:完整實現與優化指南

&#x1f3ac; 個人主頁&#xff1a;誰在夜里看海. &#x1f4d6; 個人專欄&#xff1a;《C系列》《Linux系列》《算法系列》 ?? 道阻且長&#xff0c;行則將至 目錄 &#x1f4da;一、項目概述 &#x1f4d6;1.項目背景 &#x1f4d6;2.主要功能 &#x1f4d6;3.界面展…

代理(Delegate)、閉包(Closure)、Notification(通知中心) 和 swift_event_bus適用場景和工作方式

在 Swift 開發中&#xff0c;在 Swift 開發中&#xff0c;代理&#xff08;Delegate&#xff09;、閉包&#xff08;Closure&#xff09;、Notification&#xff08;通知中心&#xff09; 和 swift_event_bus 主要用于 組件之間的通信&#xff0c;但它們的適用場景和工作方式有…

設計模式--單例模式(Singleton)【Go】

引言 在設計模式中&#xff0c;單例模式&#xff08;Singleton Pattern&#xff09;是一種非常常見且實用的模式。它的核心思想是確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。這種模式在需要全局唯一對象的場景中非常有用&#xff0c;比如配置管理、日志記錄、數…

MySQL數據庫復制

文章目錄 MySQL數據庫復制一、復制的原理二、復制的搭建1.編輯配置文件2.在主庫上創建復制的用戶3.獲取主庫的備份4.基于從庫的恢復5.建立主從復制6.開啟主從復制7.查看主從復制狀態 MySQL數據庫復制 MySQL作為非常流行的數據庫&#xff0c;支撐它如此出彩的因素主要有兩個&am…

Sourcetree——使用.gitignore忽略文件或者文件夾

一、為何需要文件忽略機制&#xff1f; 1.1 為什么要會略&#xff1f; 對于開發者而言&#xff0c;明智地選擇忽略某些文件類型&#xff0c;能帶來三大核心優勢&#xff1a; 倉庫純凈性&#xff1a;避免二進制文件、編譯產物等污染代碼庫 安全防護&#xff1a;防止敏感信息&…

基于yolov8+streamlit實現目標檢測系統帶漂亮登錄界面

【項目介紹】 基于YOLOv8和Streamlit實現的目標檢測系統&#xff0c;結合了YOLOv8先進的目標檢測能力與Streamlit快速構建交互式Web應用的優勢&#xff0c;為用戶提供了一個功能強大且操作簡便的目標檢測平臺。該系統不僅具備高精度的目標檢測功能&#xff0c;還擁有一個漂亮且…

分享vue好用的pdf 工具實測

vue3-pdf-app&#xff1a; 帶大綱&#xff0c;帶分頁&#xff0c;帶縮放&#xff0c;帶全屏&#xff0c;帶打印&#xff0c;帶下載&#xff0c;帶旋轉 下載依賴&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置類&#xff1a; 創建文件 pdfConfig.ts /…

基于微信小程序開發的寵物領養平臺——代碼解讀

項目前端 一、項目的技術架構概況 一句話概括&#xff1a;該項目是基于微信小程序開發的寵物領養平臺&#xff0c;采用原生小程序框架進行用戶界面的構建&#xff0c;使用 wx.request 進行 API 請求&#xff0c;并通過 getApp() 和本地存儲來管理全局狀態和用戶信息。 一&am…

最完美的WPF無邊框設計!

常規的無邊框方法設計 常規的WPF無邊框設計方法都是通過AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome樣式來實現,但是這樣會有問題就是,窗體最大化的時候將底部任務欄給擋住了,另外最大化的時候不能拖動窗體。參考這個大佬的設計@ 若…

【區塊鏈】btc

學習視頻源鏈接&#xff1a; https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根據肖老師的視頻進行的筆記記錄 一、 cryptographic hash function 1.1. collision resistance抗碰撞性 &#xff1a; collision 指的是hash碰撞 抗碰撞性 (Collision Resistance) 是密碼…

C語言【數據結構】:時間復雜度和空間復雜度.詳解

引言 詳細介紹什么是時間復雜度和空間復雜度。 前言&#xff1a;為什么要學習時間復雜度和空間復雜度 算法在編寫成可執行程序后&#xff0c;運行時需要耗費時間資源和空間(內存)資源。因此衡量一個算法的好壞&#xff0c;一般是從時間和空間兩個維度來衡量的&#xff0c;即時…

QT:文件讀取

問題&#xff1a; 在文件讀取&#xff0c;判斷md5值時&#xff0c;遇到py文件讀取轉String后&#xff0c;再轉byte&#xff0c;md5前后不一致問題。 解決方法&#xff1a; python文件讀取要使用QTextStream&#xff0c;避免\t 、\r、\n的換行符跨平臺問題&#xff08;window…

32單片機——LED

LED原理圖如圖所示&#xff1a; 代碼 DS0和DS1每過500ms一次交替閃爍&#xff0c;實現類似跑馬燈的效果 GPIO輸出配置步驟 &#xff08;1&#xff09;使能對應GPIO時鐘 STM32在使用任何外設之前&#xff0c;我們都要先使能其時鐘&#xff08;下同&#xff09;。本實驗用到…

貪心算法和遺傳算法優劣對比——c#

項目背景&#xff1a;某鋼管廠的鋼筋原材料為 55米&#xff0c;工作需要需切割 40 米&#xff08;1段&#xff09;、11 米&#xff08;15 段&#xff09;等 4 種規格 &#xff0c;現用貪心算法和遺傳算法兩種算法進行計算&#xff1a; 第一局&#xff1a;{ 40, 1 }, { 11, 15…

【Java篇】一法不變,萬象歸一:方法封裝與遞歸的思想之道

文章目錄 Java 方法的使用&#xff1a;從基礎到遞歸的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定義1.3 方法調用的執行過程1.4 實參和形參的關系1.5 沒有返回值的方法 二、方法重載2.1 為什么需要方法重載2.2 方法重載的概念2.2.4 C 和 Java 的比較&…

深入理解 HTML 中的<div>和元素:構建網頁結構與樣式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素雖看似普通&#xff0c;卻扮演著極為關鍵的角色。它們就像網頁搭建過程中的萬能積木&#xff0c;能夠將各種 HTML 元素巧妙地組合起來&#xff0c;無論是構建頁面布局&#xff0c;還是對局部內容進行樣式調整&#xff…

《大語言模型》學習筆記(一)

一、什么是大語言模型 大語言模型是指在海量無標注文本數據上進行預訓練得到的大型預訓練語言模型&#xff0c;例如GPT-3&#xff0c;PaLM和LLaMA。大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一種基于深度學習的自然語言處理模型&#xff0c;能…