一尘不染

如何在SQL Developer中避免“变量长度太长”错误?

sql

我正在使用大量文本更新BLOB,但出现此错误:

SQL Error: ORA-06502: PL/SQL: numeric or value error: raw variable length too long

有什么办法解决吗?

文本长度为2670个字符,通过进行了转换utl_i18n.string_to_raw,如[我如何在Oracle SQL
Developer中编辑BLOB(包含JSON)所述。并且全部在查询中的一行上。

更新: 有问题的BLOB已经包含2686个字符长的文本,比我要插入的文本长。


阅读 180

收藏
2021-03-10

共1个答案

一尘不染

ARAW限制为2000个字节。如果您的数据长于此长度,则需要将其存储在a中CLOB,然后将其转换CLOB为a
BLOB,但是不幸的是,该string_to_raw函数要比该函数复杂一点。假设您可以将整个字符串分配给一个CLOB变量,只要该字符串的长度小于32676个字节,该变量就应该起作用,这样的事情将起作用。如果长度超过此长度,则需要逐段写入CLOB,然后转换为BLOB

declare
  l_blob        blob;
  l_clob        clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*');
  l_amt         integer := dbms_lob.lobmaxsize;
  l_dest_offset integer := 1;
  l_src_offset  integer := 1;
  l_csid        integer := dbms_lob.default_csid;
  l_ctx         integer := dbms_lob.default_lang_ctx;
  l_warn        integer;
begin
  dbms_lob.createTemporary( l_blob, false );
  dbms_lob.convertToBlob( l_blob,
                          l_clob,
                          l_amt,
                          l_dest_offset,
                          l_src_offset,
                          l_csid,
                          l_ctx,
                          l_warn );
  update json_data
     set data = l_blob;
end;
/
2021-03-10