我有一个表blobtable,它有一个 BLOB 列blobcol。用户使用类似于以下的命令更新了表:
UPDATE BLOBTABLE
SET BLOBCOL=BFILENAME('directory/subdirectory', 'filename.txt')
WHERE ROWID='ROWIDVALUE';
请注意,在执行此更新之前,文件filename.txt已存在于目录中。
现在,用户说当他们从 blobtable 中选择时(使用 PL/SQL 开发人员),blobcol 包含该行的“值错误”。通常,blobcol 包含值“BFILE”。出于好奇,我尝试在 SQL*Plus 中选择相同的记录,然后得到以下 blobcol 值:
bfilename(目录/子目录','filename.txt')
我对 BLOB 及其工作方式不是很熟悉,所以我的问题是:
- 用户是否正确更新了 blobcol?
- 什么可能导致“价值错误”,如何纠正?
这不是您加载
BLOB
字段的方式。BFILENAME
返回一个BFILE
定位器,并且BFILE
数据不存储在数据库中,而是存储在数据库外部但可以访问的文件中。如果 BLOBCOL 真的是类型,上面的命令甚至不会成功
BLOB
,你会得到以下错误:ORA-00932: inconsistent datatypes: expected BLOB got FILE
另一个错误是
BFILENAME
期望目录数据库对象的名称,而不是文件系统上的目录路径。如果你想
BLOB
用文件的内容更新一个字段,你可以这样做:至于导致该
Value Error
消息的原因,我们不知道您的表结构,也不知道它是如何加载的确切方法,但我认为它是用不适当的方法完成的。最后,如果您的文件确实是纯文本文件(只是因为 猜测
.txt
),那么您可以将其存储在 aCLOB
而不是BLOB
.