下面是存储过程,但是写出来的图片跟原来的不一样,哪里不对???CREATE OR REPLACE PROCEDURE proc_export_blob (picname varchar2) IS
  l_file      UTL_FILE.FILE_TYPE;
  l_buffer    RAW(32767);
  l_amount    BINARY_INTEGER := 32767;
  l_pos       INTEGER := 1;
  l_blob      BLOB;
  l_blob_len  INTEGER;
  
BEGIN
    SELECT pic INTO  l_blob FROM  unit WHERE  id=1;
     
    l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
    l_file := UTL_FILE.FOPEN('BLOBDIR',picname,'w',32767);    WHILE l_pos < l_blob_len LOOP
      DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
      UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
      l_pos := l_pos + l_amount;
    END LOOP;
     
    UTL_FILE.FCLOSE(l_file);
     
    EXCEPTION
    WHEN OTHERS THEN
         IF UTL_FILE.IS_OPEN(l_file) THEN
         UTL_FILE.FCLOSE(l_file);
    END IF;
    RAISE;
END proc_export_blob;

解决方案 »

  1.   

    如果是图片,打开模式改成"wb"试试吧:
     l_file := UTL_FILE.FOPEN('BLOBDIR',picname,'wb',32767); 
      

  2.   

    UTL_FILE.FOPEN('BLOBDIR',picname,'wb',32767); 
    这个我试过了啊,可是一执行存储过程就报错
    ORA-29281 模式无效 难道跟版本有关系?我用的是9.2.0.1.0
      

  3.   

    oracle直接用存储过程操作大字段是有问题,据说中对数据大小的限制,不能超过32K
      

  4.   


    文件模式打开错误吧!ORA-29281: invalid mode 
    Cause: An invalid value was specified for file open mode.
    Action: Correct the mode to be one of the values: "r","a", or "w".
      

  5.   

    CREATE OR REPLACE PROCEDURE proc_export_blob (picname varchar2) IS 
      l_file      UTL_FILE.FILE_TYPE; 
      l_buffer    RAW(32767); 
      l_amount    BINARY_INTEGER := 32767; 
      l_pos      INTEGER := 1; 
      l_blob      BLOB; 
      l_blob_len  INTEGER; 
      
    BEGIN 
        SELECT pic INTO  l_blob FROM  unit WHERE  id=1; 
        
        l_blob_len := DBMS_LOB.GETLENGTH(l_blob); 
        l_file := UTL_FILE.FOPEN('BLOBDIR',picname,'w'/*将w改成r或者a试试看*/,32767); --将w改成r或者a试试看    WHILE l_pos < l_blob_len LOOP 
          DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer); 
          UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE); 
          l_pos := l_pos + l_amount; 
        END LOOP; 
        
        UTL_FILE.FCLOSE(l_file); 
        
        EXCEPTION 
        WHEN OTHERS THEN 
            IF UTL_FILE.IS_OPEN(l_file) THEN 
            UTL_FILE.FCLOSE(l_file); 
        END IF; 
        RAISE; 
    END proc_export_blob; 
      

  6.   

    在oracle 10g 下运行 
    l_file := UTL_FILE.FOPEN('BLOBDIR',picname,'wb'/*w应该为wb*/,32767);