2017-07-22 53 views
-1

我創建了一個表「圖像」類型的「斑點」列「形象」:Oracle 10g的SQL:插入二進制BLOB產生錯誤

SQL> create table images(
    2 image blob); 

Table created. 

但是當我嘗試將圖像添加到blob,會發生以下錯誤:

SQL> insert into images(image) values('D:\wallp\anon.png'); 
insert into images(image) values('D:\wallp\anon.png') 
            * 
ERROR at line 1: 
ORA-01465: invalid hex number 

如何修復錯誤?

+0

歡迎堆棧溢出!我已經格式化了您的問題並添加了相關的標籤,因此您的問題可以更容易找到。 – David

+0

_我該如何解決錯誤?_您可以通過先閱讀Oracle數據庫概念指南,然後瞭解服務器和客戶端之間的差異來修復錯誤。您的PC上或承載Oracle數據庫的服務器上是您的'd:\ wallp \ anon.png'嗎?或者您的PC實際託管Oracle數據庫? – nop77svk

回答

0

您無法從pl/sql訪問本地目錄。如果您使用bfile,您將在運行Oracle的服務器上設置一個目錄(創建目錄),您需要放置圖像。

你應該做這樣的事情:

1)創建目錄對象什麼將指向服務器端訪問的文件夾

創建目錄image_files AS「/數據/圖像」 / 2)將您的文件到操作系統文件夾目錄對象指向

3)提供所需的訪問權限的Oracle架構究竟會從文件中的數據加載到表:

4)使用BFI LENAME,EMPTY_BLOB功能和DBMS_LOB包(例如沒有經過測試 - 是護理),如在下面:

DECLARE 
    l_blob BLOB; 
    v_src_loc BFILE := BFILENAME('IMAGE_FILES', 'myimage.png'); 
    v_amount INTEGER; 
BEGIN 
    INSERT INTO esignatures 
    VALUES (100, 'BOB', empty_blob()) RETURN iblob INTO l_blob; 
    DBMS_LOB.OPEN(v_src_loc, DBMS_LOB.LOB_READONLY); 
    v_amount := DBMS_LOB.GETLENGTH(v_src_loc); 
    DBMS_LOB.LOADFROMFILE(l_blob, v_src_loc, v_amount); 
    DBMS_LOB.CLOSE(v_src_loc); 
    COMMIT; 
END; 
/

在這之後你會得到你的文件的BLOB列的內容,並且可以使用Java例如把它找回來。

0

爲了與大家需要了解LOB定位,這是指向大對象數據在數據庫(或文件系統)的概念LOB數據類型的工作

當您創建表(在你的問題)

create table images(
    image blob); 

這裏image列將存儲LOB定位器,這反過來將指向存儲在數據庫中的數據。所以所有的工作(檢索,持久化)都是通過LOB定位器完成的。 如果您不寫信,但僅檢索BLOB s,與代表外部LOB類型的BFILE配合使用會更方便。定位器將指向您磁盤上的文件,而不是數據庫本身中的段。

的步驟將是:

CREATE DIRECTORY image_file AS 'D:\wallp\anon.png' // requires CREATE ANY DIRECTORY privilege 
GRANT READ ON DIRECTORY image_file TO super_user; 

然後PL/SQL腳本

DECLARE 
    img_loc BFILE; // Declare LOB locator 
BEGIN 
    img_loc := BFILENAME('IMAGE_FILE','myimage.png'); //Invoke BFILENAME and pass dir/file 
    INSERT INTO images (image) // table is images and column is image 
     VALUES (img_loc); 
END;