sql - 无法将 BLOB 数据插入表中
问题描述
我正在尝试将图像存储在 blob 列中。我使用以下代码创建了表 job_resumes2:
create table job_resumes2(
resume_id number,
first_name varchar2(25),
last_name varchar2(25),
profile_picture blob);
然后我创建了一个目录:
create directory myimages as 'C:\MYIMAGES';
然后我执行了以下过程来填充表,但执行时出现错误:
SQL> DECLARE
2 SRC bfile := bfilename('MYIMAGES','x.jpg');
3 dest blob;
4 begin
5 insert into job_resumes2 values(1,'John','M',empty_blob())
6 returning profile_picture into dest;
7 dbms_lob.open(src,dbms_lob.lob_readonly);
8 dbms_lob.loadfromfile(dest,src,dbms_lob.getlength(src));
9 dbms_lob.close(src);
10 commit;
11 end;
12 /
DECLARE
*
ERROR at line 1:
ORA-22288: file or LOB operation FILEOPEN failed
The data is invalid.
ORA-06512: at "SYS.DBMS_LOB", line 1031
ORA-06512: at line 7
我已确保目录和文件 x.jpg 存在。有什么问题,我能做些什么来解决它?
解决方案
数据库安装在哪里?是在你的电脑上吗?因为,目录必须驻留在数据库服务器上(或者可以访问它 - 如果它在其他地方,请使用 UNC 来创建它)。"C:\temp" 看起来像是您自己的 PC,所以 - 它可能无法正常工作。
从权限开始:目录(作为 Oracle 对象)归 SYS 所有,SYS 必须向将使用它的用户授予权限,例如
grant read, write on directory myimages to jtruant;
[编辑:这是一个工作示例]
这是我的目录:
SQL> select directory_name from all_directories;
DIRECTORY_NAME
------------------------------
EXT_DIR
创建表:
SQL> create table job_resumes2
2 (resume_id number,
3 first_name varchar2(25),
4 last_name varchar2(25),
5 profile_picture blob);
Table created.
运行程序:
SQL> declare
2 src_lob bfile := bfilename('EXT_DIR', 'robco.jpg');
3 dest_lob blob;
4 begin
5 insert into job_resumes2
6 (resume_id, first_name, last_name, profile_picture)
7 values
8 (1, 'John', 'M', empty_blob())
9 returning profile_picture into dest_lob;
10
11 dbms_lob.open(src_lob, dbms_lob.lob_readonly);
12 dbms_lob.loadfromfile( dest_lob => dest_lob,
13 src_lob => src_lob,
14 amount => dbms_lob.getlength(src_lob) );
15 dbms_lob.close(src_lob);
16
17 commit;
18 end;
19 /
PL/SQL procedure successfully completed.
有什么吗?
SQL> select dbms_lob.getlength(profile_picture) from job_resumes2;
DBMS_LOB.GETLENGTH(PROFILE_PICTURE)
-----------------------------------
6427
SQL>
似乎还可以。试着按照我的步骤,看看会发生什么。
推荐阅读
- c# - 如何使用 .Net Core 验证 KeyCloak 提供的 JWT?
- regex - 如何在不拆分 McDonald 的情况下将 camelCase 与 Regex 拆分?
- javascript - 如何在循环对象时渲染多个组件,然后插入相关的 JSX?
- imagemagick - 如何使用 imagemagick cli 处理多个元素?
- c++ - 为什么 C++ 中循环迭代器的范围从 1 而不是 0 开始?
- apache - 添加共享文件夹也作为文档根目录
- python - 生成一个多维 numpy 数组,使得 a[x,y] = [x,y] (从密集光流计算基本矩阵)
- mysql - 减去两个表的 Select(Sum) Group By
- javascript - 使用 javascript 生成字母数字序列
- node.js - 如何逐步同步执行后端(Node.js Express)中的命令?