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

Posted

技术标签:

【中文标题】Oracle RawToHex 函数 - 如果返回值超过 varchar2 限制会发生啥?【英文标题】:Oracle RawToHex function - what happens if return value exceeds varchar2 limit?Oracle RawToHex 函数 - 如果返回值超过 varchar2 限制会发生什么? 【发布时间】:2011-12-18 01:06:04 【问题描述】:

Oracle 11g 中的 RawToHex 函数返回任何原始值的十六进制表示。 此函数以 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;

【问题讨论】:

pl/sql有一个限制,我们只能处理32k的数据,参考long raw data into clob 【参考方案1】:

你会得到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所述。

【讨论】:

对于 PLSQL,不会发生此错误。只要 blob 不超过大小限制,blob 似乎就会转换为合适的数据类型并正确转换,否则会引发错误。我已经更新了我的问题

以上是关于Oracle RawToHex 函数 - 如果返回值超过 varchar2 限制会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle函数ROWTOHEX()的问题

oracle函数和存储过程示例

关于ORACLE列转行的问题

Oracle Wed ADI 致命错误

求助oracle高手,将varchar类型数据插入到blob类型字段中

说说 Oracle 的 NVL 与 NVL2 函数