SQL> drop table IMAGE_LOB;表已丢弃。SQL> CREATE TABLE IMAGE_LOB (
  2  T_ID VARCHAR2 (5) NOT NULL,
  3  T_IMAGE BLOB NOT NULL
  4  );表已创建。SQL> CREATE OR REPLACE DIRECTORY IMAGES AS 'C:\Inetpub\wwwroot';目录已创建。SQL> CREATE OR REPLACE PROCEDURE IMG_INSERT (
  2  TID           VARCHAR2,
  3  FILENAME      VARCHAR2) AS
  4     F_LOB   BFILE;
  5     B_LOB   BLOB;
  6   BEGIN
  7       INSERT INTO IMAGE_LOB (T_ID, T_IMAGE) VALUES (TID,
  8  EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
  9       F_LOB:= BFILENAME ('IMAGES', FILENAME);
10       DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);
11       DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,
12  DBMS_LOB.GETLENGTH (F_LOB));
13       DBMS_LOB.FILECLOSE (F_LOB);
14       COMMIT;
15   END;
16  /过程已创建。SQL> BEGIN
  2      IMG_INSERT('1','win2000.gif');
  3   END;
  4  /PL/SQL 过程已成功完成。SQL> select length(t_image) from image_lob where t_id='1';LENGTH(T_IMAGE)
---------------
           4670SQL>

解决方案 »

  1.   

    關於lob字段的使用
    樓主可以查看書籍或論壇的faq
      

  2.   

    谢谢楼上兄,
    declare
        lobloc blob;
        amount int;
        offset int:=1;
        buffer raw(1000);
        handle UTL_FILE.FILE_TYPE;
    BEGIN 
        SELECT T_IMAGE INTO lobloc from image_lob where t_id = &id;
        amount:=dbms_lob.getlength(lobloc);
        dbms_lob.read(lobloc,amount,offset,buffer);
        handle:=utl_file.fopen('IMAGES','dd.jpg','w',1000);
        utl_file.put_raw(handle,buffer);
        utl_file.fclose(handle);
    end;
    我用这个语句读出数据,必须是小于2k的,要是大于2k的怎么写循环啊/
      

  3.   

    //先建立表 lob_example1
    create table lob_example1(
    id number(6) primary key,
    name varchar2(10),
    resume clob
    );//插入数据
    insert into lob_example1 values(1,'猪',empty_clob());
    insert into lob_example1 values(2,'狗',empty_clob());
    commit;//创建目录
    CREATE OR REPLACE DIRECTORY DOCS AS 'C:\';//创建将文件内容写入数据库CLOB的存储过程
    CREATE OR REPLACE PROCEDURE update_doc(
       t_id  number,
       filename varchar2 
       )
    as
       lobloc clob;
       fileloc bfile;
       amount int;
       src_offset int:=1;
       dest_offset int:=1;
       csid int:=0;
       lc  int:=0;
       warning int;
    begin
       fileloc:=bfilename('DOCS',filename);
       dbms_lob.fileopen(fileloc,0);
       amount:=dbms_lob.getlength(fileloc);
       select resume into lobloc from lob_example1
         where id=t_id for update;
       dbms_lob.loadclobfromfile(lobloc,fileloc,amount,dest_offset,src_offset,csid,lc,warning);
       dbms_lob.fileclose(fileloc);
       commit;
    end;//调用存储过程,把文件读入数据库CLOB中
    call update_doc(1,'aa.csv');
    call update_doc(2,'bb.csv');//察看id是2和1的行中文件大小
    select length(resume) from lob_example1 where id=2;select length(resume) from lob_example1 where id=1;/////////////////////////////////////////////////////文件已经放入数据库//将文件从数据库clob中读出来
    CREATE OR REPLACE PROCEDURE get_doc(
       t_id  number,
       filename varchar2 
       )
    as
       lobloc clob;
       amount int;
       offset int:=1;
       buffer varchar2(2000);
       handle utl_file.file_type;
    begin
       select resume into lobloc from lob_example1 where id=t_id;
       amount:=dbms_lob.getlength(lobloc);
       dbms_lob.read(lobloc,amount,offset,buffer);
       handle:=utl_file.fopen('DOCS',filename,'w',2000);
       utl_file.put_line(handle,buffer);
       utl_file.fclose(handle);
    end;
    /
     
    //调用这个过程,把文件读出来
    call get_doc(1,'zz.csv');