将 BLOB 转换为 CLOB 时出现数字或值错误
Numeric or value error when converting BLOB to CLOB
我有一个 BLOB 列,我需要它在 CLOB 中的内容,以便我可以使用更多的字符串函数。不幸的是,我在 table 上只有 SELECT 权限,所以我无法更改它的结构。
我使用 DBMS_LOB
包,它适用于相对较小的 BLOBS。例如,BLOB 30.000 长度是可以的,但是 40.000 长 BLOB 我得到
ORA-06502: PL/SQL: numeric or value error%s.
这让我怀疑某处涉及 VARCHAR2 转换,但我无法弄清楚如何,因为我有 none 个 VARCHAR2 变量。
我最长的 BLOB 有 63.000 个字符。
使用下面的方法,我设法转换了 53 行中的 50 行。 (剩下的 3 个大于 30.000 个字符。)
如有任何帮助,我们将不胜感激。
提前致谢。
SET serveroutput ON;
DECLARE
sRuleName [column]%type;
bRuleBLOB BLOB;
cRuleBLOB CLOB;
v_file_size number := dbms_lob.lobmaxsize;
v_dest_offset number := 1;
v_src_offset number := 1;
v_blob_csid number := dbms_lob.default_csid;
v_lang_context number := dbms_lob.default_lang_ctx;
v_warning number;
CURSOR cRules IS
SELECT [column]
FROM [table]
WHERE [column] IN ('x','y','z')
ORDER BY [column];
BEGIN
dbms_output.enable(100000);
OPEN cRules;
LOOP
FETCH cRules INTO sRuleName;
EXIT WHEN cRules%NOTFOUND;
--dbms_output.put_line(sRuleName);
SELECT rule
INTO bRuleBLOB
FROM [table]
WHERE [column] = sRuleName;
dbms_lob.createtemporary(cRuleBLOB, true);
v_dest_offset := 1;
v_src_offset := 1;
dbms_lob.converttoclob(cRuleBLOB, bRuleBLOB, v_file_size, v_dest_offset, v_src_offset, v_blob_csid, v_lang_context, v_warning);
dbms_output.put_line(cRuleBLOB);
dbms_lob.freetemporary(cRuleBLOB);
END LOOP;
CLOSE cRules;
END;
问题出在
dbms_output.put_line(cRuleBLOB);
单行输出最大长度为32767字节。
我有一个 BLOB 列,我需要它在 CLOB 中的内容,以便我可以使用更多的字符串函数。不幸的是,我在 table 上只有 SELECT 权限,所以我无法更改它的结构。
我使用 DBMS_LOB
包,它适用于相对较小的 BLOBS。例如,BLOB 30.000 长度是可以的,但是 40.000 长 BLOB 我得到
ORA-06502: PL/SQL: numeric or value error%s.
这让我怀疑某处涉及 VARCHAR2 转换,但我无法弄清楚如何,因为我有 none 个 VARCHAR2 变量。
我最长的 BLOB 有 63.000 个字符。
使用下面的方法,我设法转换了 53 行中的 50 行。 (剩下的 3 个大于 30.000 个字符。)
如有任何帮助,我们将不胜感激。
提前致谢。
SET serveroutput ON;
DECLARE
sRuleName [column]%type;
bRuleBLOB BLOB;
cRuleBLOB CLOB;
v_file_size number := dbms_lob.lobmaxsize;
v_dest_offset number := 1;
v_src_offset number := 1;
v_blob_csid number := dbms_lob.default_csid;
v_lang_context number := dbms_lob.default_lang_ctx;
v_warning number;
CURSOR cRules IS
SELECT [column]
FROM [table]
WHERE [column] IN ('x','y','z')
ORDER BY [column];
BEGIN
dbms_output.enable(100000);
OPEN cRules;
LOOP
FETCH cRules INTO sRuleName;
EXIT WHEN cRules%NOTFOUND;
--dbms_output.put_line(sRuleName);
SELECT rule
INTO bRuleBLOB
FROM [table]
WHERE [column] = sRuleName;
dbms_lob.createtemporary(cRuleBLOB, true);
v_dest_offset := 1;
v_src_offset := 1;
dbms_lob.converttoclob(cRuleBLOB, bRuleBLOB, v_file_size, v_dest_offset, v_src_offset, v_blob_csid, v_lang_context, v_warning);
dbms_output.put_line(cRuleBLOB);
dbms_lob.freetemporary(cRuleBLOB);
END LOOP;
CLOSE cRules;
END;
问题出在
dbms_output.put_line(cRuleBLOB);
单行输出最大长度为32767字节。