试试用这个DBMS_LOB.READ ( lob_loc IN BLOB, amount IN OUT NOCOPY BINARY_INTEGER, offset IN INTEGER, buffer OUT RAW); --buffer的类型也可以是varchar2 Parameter Description lob_loc Locator for the LOB to be read.
amount Number of bytes (for BLOBs) or characters (for CLOBs) to read, or number that were read.
offset Offset in bytes (for BLOBs) or characters (for CLOBs) from the start of the LOB (origin: 1).
buffer Output buffer for the read operation.
注:buffer的最大长度为32KB 再加个例子 CREATE OR REPLACE PROCEDURE Example_13a IS src_lob BLOB; buffer RAW(32767); amt BINARY_INTEGER := 32767; pos INTEGER := 2147483647; BEGIN SELECT b_col INTO src_lob FROM lob_table WHERE key_value = 21; LOOP dbms_lob.read (src_lob, amt, pos, buffer); -- process the buffer pos := pos + amt; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('End of data'); END;
SQL> create table tb (img blob);表已创建。SQL> insert into tb select '1234' from dual 2 /已创建 1 行。SQL> ed 已写入文件 afiedt.buf 1 declare b varchar2(10); 2 tmp blob; 3 amt binary_integer; 4 begin 5 select img into tmp from tb where rownum=1; 6 amt:=1; 7 dbms_lob.read(tmp,amt,1,b); --读第一个字节 8 dbms_output.put_line(b); 9 dbms_lob.read(tmp,amt,2,b); --读第二个字节 10 dbms_output.put_line(b); 11* end; SQL> / 12 34PL/SQL 过程已成功完成。自己写了个例子,仅供参考
而且好像也没有必要非要把它取到本地,你直接访问有什么问题吗?
lob_loc IN BLOB,
amount IN OUT NOCOPY BINARY_INTEGER,
offset IN INTEGER,
buffer OUT RAW); --buffer的类型也可以是varchar2
Parameter Description
lob_loc Locator for the LOB to be read.
amount Number of bytes (for BLOBs) or characters (for CLOBs) to read, or number that were read.
offset Offset in bytes (for BLOBs) or characters (for CLOBs) from the start of the LOB (origin: 1).
buffer Output buffer for the read operation.
注:buffer的最大长度为32KB
再加个例子
CREATE OR REPLACE PROCEDURE Example_13a IS
src_lob BLOB;
buffer RAW(32767);
amt BINARY_INTEGER := 32767;
pos INTEGER := 2147483647;
BEGIN
SELECT b_col INTO src_lob
FROM lob_table
WHERE key_value = 21;
LOOP
dbms_lob.read (src_lob, amt, pos, buffer);
-- process the buffer
pos := pos + amt;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('End of data');
END;
2 /已创建 1 行。SQL> ed
已写入文件 afiedt.buf 1 declare b varchar2(10);
2 tmp blob;
3 amt binary_integer;
4 begin
5 select img into tmp from tb where rownum=1;
6 amt:=1;
7 dbms_lob.read(tmp,amt,1,b); --读第一个字节
8 dbms_output.put_line(b);
9 dbms_lob.read(tmp,amt,2,b); --读第二个字节
10 dbms_output.put_line(b);
11* end;
SQL> /
12
34PL/SQL 过程已成功完成。自己写了个例子,仅供参考
然后在播放这10秒的时候,继续读取下一个10秒的影像。然后在播放,如此循环,直到播放完毕。关于播放的连续性我就不清楚了。你看看是把数据放在内存中还是保存到文件里面。应该可以放在内存中保证连续性吧。