and*_*a77 2 oracle oracle-11g-r2 blob
我有一个表blobtable,它有一个 BLOB 列blobcol。用户使用与此类似的命令更新了表:
UPDATE BLOBTABLE
SET BLOBCOL=BFILENAME('directory/subdirectory', 'filename.txt')
WHERE ROWID='ROWIDVALUE';
Run Code Online (Sandbox Code Playgroud)
请注意,在执行此更新之前,目录中存在文件filename.txt。
现在,用户说当他们从 blobtable 中选择时(使用 PL/SQL 开发人员),blobcol 包含该行的“值错误”。通常,blobcol 包含值“BFILE”。出于好奇,我尝试在 SQL*Plus 中选择相同的记录,并得到以下 blobcol 值:
bfilename(目录/子目录','文件名.txt')
我对 BLOB 及其工作方式不是很熟悉,所以我的问题是:
这不是您加载BLOB
字段的方式。BFILENAME
返回一个BFILE
定位器,BFILE
数据不存储在数据库中,而是存储在数据库之外但可以访问的文件中。
如果 BLOBCOL 确实是BLOB
类型,则上述命令甚至不会成功,您将收到以下错误:
ORA-00932: inconsistent datatypes: expected BLOB got FILE
另一个错误是BFILENAME
期望目录数据库对象的名称,而不是文件系统上的目录路径。
如果要BLOB
使用文件内容更新字段,请执行以下操作:
CREATE DIRECTORY MY_DIR AS '/directory/subdirectory';
DECLARE
src_bfile BFILE := BFILENAME('MY_DIR', 'filename.txt');
dest_blob BLOB;
BEGIN
SELECT BLOBCOL into dest_blob FROM BLOBTABLE WHERE ROWID = 'ROWIDVALUE';
DBMS_LOB.OPEN(src_bfile, DBMS_LOB.LOB_READONLY);
DBMS_LOB.LoadFromFile( DEST_LOB => dest_blob,
SRC_LOB => src_bfile,
AMOUNT => DBMS_LOB.GETLENGTH(src_bfile) );
DBMS_LOB.CLOSE(src_lob);
COMMIT;
END;
/
Run Code Online (Sandbox Code Playgroud)
至于是什么导致了Value Error
消息,我们不知道您的表结构,也不知道它是如何加载的确切方法,但我认为是使用不适当的方法完成的。
最后,如果你的文件确实是一个纯文本文件(仅仅因为猜测.txt
),那么你可以存储在一个CLOB
代替BLOB
。