从oracle db中选择大型文档

时间:2014-05-06 13:14:37

标签: oracle oracle11g oracle-sqldeveloper

所以想要获得大于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,然后出于某种神圣的原因,你必须重新创建该表的所有索引......这是唯一的方法。

2 个答案:

答案 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)