调用dbms_lob包的有关功能就可以了。
对于存在BLOB字段的表不能写:select * from ..
应该将其它数据与BLOB数据分开读取,而且BLOB字段每次读一个比较好。
select blobcolname into :blob from tabname where ...

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE Example_8 IS
        fil BFILE;
        dir_alias VARCHAR2(30);
        name VARCHAR2(2000);
    BEGIN
        IF (dbms_lob.fileexists(fil))
        THEN
            dbms_lob.filegetname(fil, dir_alias, name);
            dbms_output.put_line("Opening " || dir_alias || name);
            dbms_lob.fileopen(fil, dbms_lob.file_readonly);
            -- file operations
            dbms_output.fileclose(fil); 
        END IF;
    END;CREATE OR REPLACE PROCEDURE Example_16 IS
        lob_loc        BLOB;
        buffer         RAW;
        amt            BINARY_INTEGER := 32767;
        pos            INTEGER := 2147483647;
        i              INTEGER;
    BEGIN
        SELECT b_col INTO lob_loc
            FROM lob_table
            WHERE key_value = 12 FOR UPDATE;
        FOR i IN 1..3 LOOP
            dbms_lob.write (lob_loc, amt, pos, buffer);
            -- fill in more data 
            pos := pos + amt;
        END LOOP;
        EXCEPTION4
            WHEN some_exception
            THEN handle_exception;
    END;
      

  2.   

    SQL> select * from bb;A  B
    -- --
    1  SQL> alter table bb add c blob;Table alteredSQL> update bb set c=hextoraw('2222');1 row updatedSQL> select a,dbms_lob.substr(c) from bb;A  DBMS_LOB.SUBSTR(C)
    -- --------------------------------------------------------------------------------
    1  2222
      

  3.   

    参照以下一个函数:
    create or replace function getblob(p_a in varchar2)
    return blob
    as
    p_blob blob;
    begin
    select c into p_blob from bb where a=p_a for update;
    return dbms_lob.substr(p_blob);
    end;
    /
      

  4.   

    dbms_lob.substr(lob,num,offset)
    这个函数需要设置读的数据量(缺省为32768),可是数据大小不定,而且比32768大,一定要设一个很大的值吗?
      

  5.   

    用一个stream把他从数据库中弄出来才能看。
      

  6.   

    对呀,我要先select,然后才能取
    我在讲select 的语法