如题:oracle如何读取blob数据,我想要oracle读取blob数据的方式来读出里面的数据,不要java读取。有什么好的方法,
blob里面存放的不是图片,而是1440条float数据。求大虾们帮忙。

解决方案 »

  1.   


    1.确认现有对象
      
      SQL> col fdesc for a30
      SQL> select fid,fname,fdesc from eygle_blob;
      
      FID FNAME                       FDESC
      ---------- -------------------------------------------------- ------------------------------
      1 ShaoLin.jpg                    少林寺-康熙手书
      2 DaoYing.jpg                    倒映
      
      2.创建存储Directory
      
      SQL> connect / as sysdba
      Connected.
      SQL> create or replace directory BLOBDIR as 'D:\oradata\Pic';
      
      Directory created.
      
      SQL>
      SQL> grant read,write on directory BLOBDIR to eygle;
      
      Grant succeeded.
      
      SQL>
      
      3.创建存储过程
      
      SQL> connect eygle/eygle
      Connected.
      SQL>
      SQL> CREATE OR REPLACE PROCEDURE eygle_dump_blob (piname varchar2,poname varchar2) IS
      2  l_file   UTL_FILE.FILE_TYPE;
      3  l_buffer  RAW(32767);
      4  l_amount  BINARY_INTEGER := 32767;
      5  l_pos    INTEGER := 1;
      6  l_blob   BLOB;
      7  l_blob_len INTEGER;
      8 BEGIN
      9  SELECT FPIC
      10  INTO   l_blob
      11  FROM   eygle_blob
      12  WHERE FNAME = piname;
      13
      14  l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
      15  l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767);
      16
      17  WHILE l_pos < l_blob_len LOOP
      18   DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
      19   UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
      20   l_pos := l_pos + l_amount;
      21  END LOOP;
      22
      23  UTL_FILE.FCLOSE(l_file);
      24
      25 EXCEPTION
      26  WHEN OTHERS THEN
      27   IF UTL_FILE.IS_OPEN(l_file) THEN
      28    UTL_FILE.FCLOSE(l_file);
      29   END IF;
      30   RAISE;
      31 END;
      32 /
      
      Procedure created.
      
      4.取出数据
      
      
      SQL> exec eygle_dump_blob('ShaoLin.jpg','01.jpg')
      
      PL/SQL procedure successfully completed.
      

  2.   

    楼上的读入blob存储过程很经典了,稍加改动即可。
    另外,楼主是想提取1400来个float值吗?为何不原意使用java来读取?那就写一个存储过程,返回一个float数组好了。
      

  3.   

    你的浮点数是如何存储的?每个定长字节
    可以使用dbms_lob包read读取指定偏移和指定的字节数进行处理就行了
     DBMS_LOB.READ(lob类型变量,要读的字符数,启始位置(1为最前端), 存入变量)
    参考:
      create   or   replace   procedure   get_lobdata   as  
              vblob   blob;  
              buffer   raw(32000);  
              buffer_size   integer   :=   4;  --如每次读取4字节
              offset   integer   :=   1;  
              length   number;  
          begin  
              select   blob_col   into   vblob   from   blobs   where   id   =   '111';  
              length   :=   dbms_lob.getlength(vblob);  
              while   offset   <   length   loop  
                  dbms_lob.read(vblob,   buffer_size,   offset,   buffer);     //******
                  htp.prn(utl_raw.cast_to_varchar2(buffer));  
                  offset   :=   offset   +   buffer_size;  
          end   loop;  
      exception  
              when   others   then  
          htp.p(sqlerrm);  
      end;  
      /   
      

  4.   

    是啊。。我想通过oracle实现,主要他是以字节的形式存储的,所以没有像取图片那么取