oracle如何读取blob数据 如题:oracle如何读取blob数据,我想要oracle读取blob数据的方式来读出里面的数据,不要java读取。有什么好的方法,blob里面存放的不是图片,而是1440条float数据。求大虾们帮忙。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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. 楼上的读入blob存储过程很经典了,稍加改动即可。另外,楼主是想提取1400来个float值吗?为何不原意使用java来读取?那就写一个存储过程,返回一个float数组好了。 你的浮点数是如何存储的?每个定长字节可以使用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; / 是啊。。我想通过oracle实现,主要他是以字节的形式存储的,所以没有像取图片那么取 删除和索引的关系的疑问 Checkpoint Queue问题!求高手解答 求RMAN备份和恢复的脚本 oracle10g oracle 问题,在线等。 怎么不能一起用啊? 这个JOB是什么意思啊,sys.dbms_job.broken是什么意思啊,这个JOB的执行时间是什么时间啊 为什么我定义过的函数在调用时说没定义呢? 请问为什么我把form发布到IAS,然后通过WEB访问时,提示输入用户名密码? 为什么在PL/SQL中使用exec会报错,但是在golden中能正常使用 请问这个数据库表的设计方法 PreparedStatement批量插数据含子查询问题 SQL查询效率问题
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.
另外,楼主是想提取1400来个float值吗?为何不原意使用java来读取?那就写一个存储过程,返回一个float数组好了。
可以使用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;
/