更新 BLOB 列

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 及其工作方式不是很熟悉,所以我的问题是:

  1. 用户是否正确更新了 blobcol?
  2. 什么可能导致“值错误”,如何纠正?

Bal*_*app 7

这不是您加载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