所以想要获得大于60 mb的Id文档:
SELECT
DOCS.ID
FROM DOCS
where LENGTH(DOCS.DOCUMENT) > (60*1024*1024)
我收到此错误: SQL错误:ORA-00932:不一致的数据类型:预期NUMBER获得LONG BINARY 00932. 00000 - “不一致的数据类型:预期%s获得%s” 文件是一个漫长的原始... 可能应该以某种方式施展到长期
我想出的唯一解决方案是将表从长原始转换为BLOB,然后出于某种神圣的原因,你必须重新创建该表的所有索引......这是唯一的方法。
答案 0 :(得分:0)
确实这是一个问题,但您可以使用PL / SQL作为解决方法:
create or replace function get_doc_length(iDocId in number) return number is
aLong long;
begin
select d.document into aLong from docs d where d.id = iDocId;
return length(aLong);
end;
/
不幸的是,这个函数(不能使用LONG
作为参数,因此必须特定于表DOCS
),然后可以像这样使用:
SELECT DOCS.ID
FROM DOCS
where get_doc_length(DOCS.ID) > (60*1024*1024)
编辑:好的,这对大型LONG
无效。你必须更深入地研究SQL的arcanes以使其发挥作用:
create or replace function get_doc_length(iDocId in number) return number is
myQuery varchar2(200);
myCursor binary_integer;
myRes pls_integer;
myDoc clob;
long_val long;
long_len integer;
buf_len integer;
cur_pos number;
begin
myQuery := 'select d.document from docs d where d.id = ' || iDocId;
-- Create cursor, parse and bind.
myCursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(myCursor, myQuery, DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN_LONG(myCursor, 01);
myRes := DBMS_SQL.EXECUTE(myCursor);
-- Fetch row (only one normally)
if DBMS_SQL.FETCH_ROWS(myCursor) > 0 then
-- Create CLOB.
DBMS_LOB.CREATETEMPORARY(myDoc, false, DBMS_LOB.CALL);
-- Piecewise fetching of the LONG column, appending to the CLOB.
buf_len := 32760;
cur_pos := 0;
loop
DBMS_SQL.COLUMN_VALUE_LONG(myCursor, 01, buf_len, cur_pos, long_val, long_len);
exit when long_len = 0;
DBMS_LOB.APPEND(myDoc, long_val);
cur_pos := cur_pos + long_len;
end loop;
end if;
DBMS_SQL.CLOSE_CURSOR(myCursor);
return length(myDoc);
end;
/
DBMS_SQL
包允许将LONG
转换为CLOB
,方法是循环播放LONG
并逐渐附加CLOB
的内容。
如果您希望dbms_lob.getlength
的二进制长度而不是其字符长度(可能会有所不同),则可以使用length
代替{{1}}作为this other SO post显示。
答案 1 :(得分:0)
SELECT DOCS.ID
FROM DOCS
WHERE dbms_lob.getlength(DOCS.DOCUMENT) > (60*1024*1024)