看到网上一个例子,把blob数据写入文件的例子。有一处不明白。
1 -- $Id: 001b.php,v 1.1 2007/07/01 09:03:16 hung Exp $
2 create or replace procedure write_lob(
3 dir_name in varchar,
4 file_name in varchar,
5 file_data in blob
6 )
7 is
8 file_ref utl_file.file_type;
9 lob_size number;
10 raw_max_size constant number := 32767;
11 buffer raw(32767);
12 buffer_offset number := 1; -- Position in stream
13 buffer_length number; -- Amount of data to read and write
14 begin
15 lob_size := dbms_lob.getlength(file_data);
16 -- dbms_output.put_line(dir_name || ',' || file_name || ',' || lob_siz
e);
17 file_ref := utl_file.fopen(dir_name, file_name, 'WB', raw_max_size);
18 buffer_length := raw_max_size;
19 while buffer_offset < lob_size loop
20 if buffer_offset + raw_max_size > lob_size then
21 buffer_length := lob_size - buffer_offset;
22 end if;
23 -- dbms_output.put_line(buffer_offset || ',' || buffer_length);
24 dbms_lob.read(file_data, buffer_length, buffer_offset, buffer);
25 utl_file.put_raw(file_ref, buffer, true);
26 buffer_offset := buffer_offset + buffer_length;
27 end loop;
28 utl_file.fclose(file_ref);
29 end write_lob;
30 /
调用
1 @write_lob.sql;
2 set serveroutput on
3
4 create or replace directory TEST_DIR as 'C:\Users\hung\Documents\Program
ming\Oracle\LOB';
5
6 declare
7 cursor image_cur is select * from image where dbms_lob.getlength(data)
> 0;
8 begin
9 for image_rec in image_cur
10 loop
11 write_lob('TEST_DIR', image_rec.name, image_rec.data); // 例子中表名image, 有name vchar, data blob两个列
12 end loop;
13 end;
14 /问题,我试图直接用外部的文件,比如lob_output.txt来替代image_rec.name,但是调用write_lob总是arguments 不对。
怎样正确的把外部文件名传入呢? 或者第三个参数,data有什么问题吗,谢谢。
1 -- $Id: 001b.php,v 1.1 2007/07/01 09:03:16 hung Exp $
2 create or replace procedure write_lob(
3 dir_name in varchar,
4 file_name in varchar,
5 file_data in blob
6 )
7 is
8 file_ref utl_file.file_type;
9 lob_size number;
10 raw_max_size constant number := 32767;
11 buffer raw(32767);
12 buffer_offset number := 1; -- Position in stream
13 buffer_length number; -- Amount of data to read and write
14 begin
15 lob_size := dbms_lob.getlength(file_data);
16 -- dbms_output.put_line(dir_name || ',' || file_name || ',' || lob_siz
e);
17 file_ref := utl_file.fopen(dir_name, file_name, 'WB', raw_max_size);
18 buffer_length := raw_max_size;
19 while buffer_offset < lob_size loop
20 if buffer_offset + raw_max_size > lob_size then
21 buffer_length := lob_size - buffer_offset;
22 end if;
23 -- dbms_output.put_line(buffer_offset || ',' || buffer_length);
24 dbms_lob.read(file_data, buffer_length, buffer_offset, buffer);
25 utl_file.put_raw(file_ref, buffer, true);
26 buffer_offset := buffer_offset + buffer_length;
27 end loop;
28 utl_file.fclose(file_ref);
29 end write_lob;
30 /
调用
1 @write_lob.sql;
2 set serveroutput on
3
4 create or replace directory TEST_DIR as 'C:\Users\hung\Documents\Program
ming\Oracle\LOB';
5
6 declare
7 cursor image_cur is select * from image where dbms_lob.getlength(data)
> 0;
8 begin
9 for image_rec in image_cur
10 loop
11 write_lob('TEST_DIR', image_rec.name, image_rec.data); // 例子中表名image, 有name vchar, data blob两个列
12 end loop;
13 end;
14 /问题,我试图直接用外部的文件,比如lob_output.txt来替代image_rec.name,但是调用write_lob总是arguments 不对。
怎样正确的把外部文件名传入呢? 或者第三个参数,data有什么问题吗,谢谢。
解决方案 »
- 为什么我装oracle总是有错误弹出,卸载干净了。
- 我用的是 PLSQL 怎样在检索出来的数据选择一条呢?
- 求问快速查询id=10在另一个表中的对应的最新记录
- 100 分求 .net c# + oracle 的类似BBS的源码 解决方案文件~~~~~
- 數據庫加載失敗
- oracle客户端连接服务器的问题
- 一个oracle表最多可以存多少条记录?
- 为什么9i的SQLPLUS总是附带着DOS的黑色框?
- 这个触发器该怎么写,请大侠赐教!
- [求组]db2中的with ... as (...) 在oracle中应该如何表示
- TNS-12560: TNS:协议适配器出现错误(服务器为red hat 8)
- 請問:回收用户连接数据库的命令
如果想生成自己定义的文件名,如下方法:
write_lob('TEST_DIR', 'your_file_name', image_rec.data);
create table tlob1
(i1 int DEFAULT NULL,
clob10 clob DEFAULT NULL ,
blob12 blob ,
clob100k clob ,
blob110k blob DEFAULT NULL);
我的调用
SQL> declare
2 cursor image_cur is select * from tlob1; tlob1;
3 begin
4 for image_rec in image_cur
5 loop
6 write_lob('TEST_DIR', 'lob_output.txt', image_rec.CLOB100K); // lob_output.txt是当前路径下已经建立的文件
7 end loop;
8 end;
9 /
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 475
ORA-29283: invalid file operation
ORA-06512: at "J15USER1.WRITE_LOB", line 13
ORA-06512: at line 6请问为什么会出错
2 cursor image_cur is select * from tlob1; tlob1;
3 begin 红色的多余吧!
此外文件不用先存在的,会自己创建。