无法直接用纯SQL语句实现,但可以写个PL/SQL块来实现。 具体实例,请参考-- 创建表空间TeacherSpace CREATE TABLESPACE TeacherSpace DATAFILE 'TeacherDFile.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;-- 老师信息表 CREATE TABLE Teacher ( NAME CHAR(10), --姓名 RESUME CLOB, --简历 Photo BLOB, --照片 Recording BFILE --自我陈述(录音) ) LOB(RESUME, Photo) STORE AS ( TABLESPACE TeacherSpace STORAGE(INITIAL 6144 NEXT 6144) CHUNK 8K ENABLE STORAGE IN ROW );-- 创建目录DBFILE_DIR, 并授与用户权限,需要SYS帐户 CREATE OR REPLACE DIRECTORY DBFILE_DIR AS 'D:\D12_01'; GRANT READ ON DIRECTORY DBFILE_DIR TO TEST; -- 向Teacher表插入2条记录 INSERT INTO Teacher VALUES('张力', EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME('DBFILE_DIR', 'a.mp3')); INSERT INTO Teacher VALUES('王永', EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME('DBFILE_DIR', 'b.mp3')); 下面写一个PL/SQL程序块,对照片字段进行赋值。 到此,搞定。
现将文件转换成二进制流,在转换成blob
可以先insert记录,然后再updateblob来更新blob字段,共两条SQL。
楼上的xiaobn_cn,能具体写下你的SQL吗?
经查证,我在3楼所说的方法是PB语言的方法,不适用于其它语言。代码大致如下:insert into tab1 (id) values (:id); updateblob tab1 set phone = :ph where id = :id;
to LuiseRADL:用你的代码试了,还是有问题,在 Dbms_Lob.open(destloc,dbms_lob.lob_readwrite); 出现 ora-22292:无法在没有事务处理的情况下以读写模式打开blob 另外问下 DBFILE_DIR 这个在过程里需要定义吗,直接用不能用,加引号后是否又起不到作用, 如果要定义 那是什么类型,我用sys用户已经创建DBFILE_DIR并授权了。但在过程里如何使用? create or replace procedure pro_blobsql is destloc blob; srcloc bfile; amount number(10); begin amount := 4000; select name into destloc from tblowtest; select bfilename('DBFILE_DIR','1.jpg') into srcloc from dual; Dbms_Lob.open(srcloc,dbms_lob.lob_readonly); Dbms_Lob.open(destloc,dbms_lob.lob_readwrite); Dbms_lob.loadfromfile(destloc,srcloc,amount); Dbms_lob.close(destloc); Dbms_lob.close(srcloc); commit; end;
具体实例,请参考-- 创建表空间TeacherSpace
CREATE TABLESPACE TeacherSpace
DATAFILE 'TeacherDFile.dbf' SIZE 10M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;-- 老师信息表
CREATE TABLE Teacher
(
NAME CHAR(10), --姓名
RESUME CLOB, --简历
Photo BLOB, --照片
Recording BFILE --自我陈述(录音)
)
LOB(RESUME, Photo) STORE AS
(
TABLESPACE TeacherSpace
STORAGE(INITIAL 6144 NEXT 6144)
CHUNK 8K
ENABLE STORAGE IN ROW
);-- 创建目录DBFILE_DIR, 并授与用户权限,需要SYS帐户
CREATE OR REPLACE DIRECTORY DBFILE_DIR AS 'D:\D12_01';
GRANT READ ON DIRECTORY DBFILE_DIR TO TEST;
-- 向Teacher表插入2条记录
INSERT INTO Teacher VALUES('张力', EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME('DBFILE_DIR', 'a.mp3'));
INSERT INTO Teacher VALUES('王永', EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME('DBFILE_DIR', 'b.mp3'));
下面写一个PL/SQL程序块,对照片字段进行赋值。
到此,搞定。
经查证,我在3楼所说的方法是PB语言的方法,不适用于其它语言。代码大致如下:insert into tab1 (id) values (:id);
updateblob tab1 set phone = :ph where id = :id;
Dbms_Lob.open(destloc,dbms_lob.lob_readwrite);
出现 ora-22292:无法在没有事务处理的情况下以读写模式打开blob
另外问下 DBFILE_DIR 这个在过程里需要定义吗,直接用不能用,加引号后是否又起不到作用,
如果要定义 那是什么类型,我用sys用户已经创建DBFILE_DIR并授权了。但在过程里如何使用?
create or replace procedure pro_blobsql is
destloc blob;
srcloc bfile;
amount number(10);
begin
amount := 4000;
select name into destloc from tblowtest;
select bfilename('DBFILE_DIR','1.jpg') into srcloc from dual;
Dbms_Lob.open(srcloc,dbms_lob.lob_readonly);
Dbms_Lob.open(destloc,dbms_lob.lob_readwrite);
Dbms_lob.loadfromfile(destloc,srcloc,amount);
Dbms_lob.close(destloc);
Dbms_lob.close(srcloc);
commit;
end;