tablename: tab1; 字段:id number , phone blob 两个字段, 一个图片文件:c:\test\phone1.jpg 中,如何把这个图片文件用sql写入到这个表中,麻烦能具体写一下吗,谢谢!

解决方案 »

  1.   

    无法直接用纯SQL语句实现,但可以写个PL/SQL块来实现。
    具体实例,请参考-- 创建表空间TeacherSpace
    CREATE TABLESPACE TeacherSpace
    DATAFILE 'TeacherDFile.dbf' SIZE 10M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;-- 老师信息表
    CREATE TABLE Teacher
    (
        NAME        CHAR(10), --姓名
        RESUME      CLOB,     --简历
        Photo       BLOB,     --照片
        Recording   BFILE     --自我陈述(录音)
    )    
    LOB(RESUME, Photo) STORE AS 
    (
        TABLESPACE TeacherSpace
        STORAGE(INITIAL 6144 NEXT 6144)
        CHUNK 8K
        ENABLE STORAGE IN ROW
    );-- 创建目录DBFILE_DIR, 并授与用户权限,需要SYS帐户
    CREATE OR REPLACE DIRECTORY DBFILE_DIR AS 'D:\D12_01';
    GRANT READ ON DIRECTORY DBFILE_DIR TO TEST;
    -- 向Teacher表插入2条记录
    INSERT INTO Teacher VALUES('张力', EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME('DBFILE_DIR', 'a.mp3'));
    INSERT INTO Teacher VALUES('王永', EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME('DBFILE_DIR', 'b.mp3'));
    下面写一个PL/SQL程序块,对照片字段进行赋值。
    到此,搞定。
      

  2.   

    现将文件转换成二进制流,在转换成blob
      

  3.   

    可以先insert记录,然后再updateblob来更新blob字段,共两条SQL。
      

  4.   

    楼上的xiaobn_cn,能具体写下你的SQL吗?
      

  5.   


    经查证,我在3楼所说的方法是PB语言的方法,不适用于其它语言。代码大致如下:insert into tab1 (id) values (:id);
    updateblob tab1 set phone = :ph where id = :id;
      

  6.   

    to LuiseRADL:用你的代码试了,还是有问题,在
     Dbms_Lob.open(destloc,dbms_lob.lob_readwrite);
    出现 ora-22292:无法在没有事务处理的情况下以读写模式打开blob
    另外问下 DBFILE_DIR 这个在过程里需要定义吗,直接用不能用,加引号后是否又起不到作用,
    如果要定义 那是什么类型,我用sys用户已经创建DBFILE_DIR并授权了。但在过程里如何使用?
    create or replace procedure pro_blobsql is
    destloc blob;
    srcloc bfile;
    amount number(10);
    begin
      amount := 4000;
      select name into destloc from tblowtest;
      select bfilename('DBFILE_DIR','1.jpg') into srcloc from dual;
      Dbms_Lob.open(srcloc,dbms_lob.lob_readonly);
      Dbms_Lob.open(destloc,dbms_lob.lob_readwrite);
      Dbms_lob.loadfromfile(destloc,srcloc,amount);
      Dbms_lob.close(destloc);
      Dbms_lob.close(srcloc);
      commit;
    end;