查了一天的blob,还是没理解到,我想在VC下存取二进制的文件,使用的是oo4o,照着帮助文档上面的写了写入数据库的代码,还是没写对,错误提示是this operation is not permitted on a empty LOB,这是什么意思啊?照着示例代码写都不对呢?我还想问的是能不能在sqlplus下面用insert插入这类型的数据呢?如果可以怎么写呢?谢谢,请高手指教!

解决方案 »

  1.   

    vc,我不知道行不行。如果你用java,我敢肯定能够操作lob。因为以前一个项目就用过,但记得 不是和很清楚了。
    好像用java操作大对象前先要插入一个oracle的empty类型,然后再对其进行修改,并且要查询出先前插入的empty记录,并锁定该行,然后再插入lob。
      

  2.   

    旧版本的oracle,blob需要先insert 一个 empty blob,然后取到记录的ID,然后再update。(java下)c不会不懂噢
      

  3.   

    我也是先插入空的再Update的,但还是不行啊,我用的是11g的,有没有会VC的啊?
      

  4.   

    旧版本的oracle,blob需要先insert 一个 empty blob,然后取到记录的ID,然后再update。(java下)c不会不懂噢2楼的介绍一下新版的oracle是怎么处理lob的,你说的新版是11g吗?
      

  5.   

    可以把CLOB类型转成VARCHAR2类型
    获取文本   DBMS_LOB.SUBSTR(col1,n,pos)  
      如DBMS_LOB.SUBSTR(col1,10,1)表示从第1个字节开始取出10个字节
      

  6.   

    使用存储过程吧。
    create or replace package body plan_fileUntil is
      function downLoadFile(uuid varchar2, filePath varchar2,fileName varchar2)  return integer  is
      /* *******************************************************************************************
      --功    能:从Oracle中下载文件
      --输入参数:
         uuid:文件唯一UUID ,bfile_path--下载文件存放的全路径目录,如“F:/temp", fileName:下载后文件名称
      --输出参数: 文件下载是否成功       path varchar2(20) := 'cjsbfile_path';/*目录名称*/
           directoryNum int;
           tmpSql varchar2(2000);
           blob_loc BLOB;
           handle UTL_FILE.file_type;
           fileLength int;
           l_pos INTEGER := 1;
           l_amount BINARY_INTEGER := 32767;
           l_buffer RAW(32767);
           
           begin
             
              select filecontent into blob_loc from plan_files where uuid=id;   
              fileLength:=dbms_lob.getlength(blob_loc);
              handle:=utl_file.fopen(upper(path),filename,'wb',32767);
               
              WHILE l_pos < fileLength LOOP
                   dbms_lob.READ (blob_loc, l_amount, l_pos, l_buffer);
                   UTL_FILE.PUT_RAW(handle, l_buffer, TRUE);
                   l_pos := l_pos + l_amount;
              END LOOP;
              utl_file.fclose(handle);
              return 1;
               
              exception /*如果发生异常*/
                 WHEN OTHERS THEN
                    IF UTL_FILE.IS_OPEN(handle) THEN/*关闭文件*/
                       UTL_FILE.FCLOSE(handle);
                    END IF;
                     
                    execute immediate 'drop directory ' || path;/*删除已经创建的目录*/
                    return 0;/*失败*/
      end;