Oracle RawToHex函数 - 如果返回值超过varchar2限制会发生什么?

时间:2011-12-18 01:06:05

标签: oracle plsql blob long-integer

Oracle 11g中的RawToHex函数返回任何原始值的十六进制表示形式。 此函数将Hex值作为varchar2返回。

如果我将BLOB传递给RawToHex()函数会导致十六进制表示超过varchar2限制4000,会发生什么?

有没有办法将非常大的BLOB转换成十六进制表示?

更新:

我做了一些调查,并在我的问题的第一部分找到了答案。 我可以将BLOB传递给RawToHex函数,只要您不会触及Raw DataType的边界,这个就会成功执行。 Oracle似乎隐式地从BLOB转换为Raw。

DECLARE

a varchar2(32767);
b blob;

BEGIN

select blob_column into b from a_table where a_table_id = 1;
dbms_output.put_line(dbms_lob.getlength(b)); --> output: 216
dbms_output.put_line(rawtohex(empty_blob())); --> converted blob

select blob_column into b from a_table where a_table_id = 2;
dbms_output.put_line(dbms_lob.getlength(b)); --> output: 140000
dbms_output.put_line(rawtohex(empty_blob())); --> ORA-06502: PL/SQL: numeric or value error

END;

根据ora-code.com

描述此错误
  

ORA-06502:PL / SQL:数字或值错误字符串

     

原因:发生算术,数字,字符串,转换或约束错误。例如,如果尝试将值NULL分配给声明为NOT NULL的变量,或者尝试将大于99的整数分配给声明为NUMBER(2)的变量,则会发生此错误。

     

操作:更改数据,操作方式或声明方式,以便值不会违反约束。

更新2:

我已经找到了解决这个问题的方法。将blob拆分为更小的块并逐步转换它们。它提供了正确的结果。这是一种正确的方法还是可以在某个时候解决这个问题呢?

function BlobToHex(data in blob) return clob
is
    v_clob    clob;
    v_start  pls_integer := 1;
    v_buffer pls_integer := 4000;
begin
    if data is null
    then
        return '""';
    end if;

    dbms_lob.createtemporary(v_clob, true);
    dbms_lob.append(v_clob, '0x');

    for i in 1..ceil(dbms_lob.getlength(data) / v_buffer)
    loop
        dbms_lob.append(v_clob, rawtohex(DBMS_LOB.SUBSTR(data, v_buffer, v_start)));
        v_start := v_start + v_buffer;
    end loop; 

    return v_clob;
end;

1 个答案:

答案 0 :(得分:2)

您将获得ORA-00932

SQL> select rawtohex(empty_blob()) from dual;
select rawtohex(empty_blob()) from dual
                *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got BLOB
SQL>

因为

  

作为SQL内置函数,RAWTOHEX接受除LONG,LONG RAW,CLOB,BLOB或BFILE之外的任何标量数据类型的参数。

正如the documentation所述。