看到网上一个例子,把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.   

    上面的代码没有任何问题,我这里执行的一切ok。
    如果想生成自己定义的文件名,如下方法:
    write_lob('TEST_DIR', 'your_file_name', image_rec.data);  
      

  2.   

    我的表
    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请问为什么会出错
      

  3.   

    SQL> declare 
      2  cursor image_cur is select * from tlob1; tlob1; 
      3  begin 红色的多余吧!
    此外文件不用先存在的,会自己创建。