2017-07-22 50 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;