如何从NCLOB中获取适合VARCHAR2(4000)的最长字符串?

时间:2016-01-08 15:13:34

标签: oracle11g clob

我想把前4000个字符中的最多只能用于适合4000字节的最大字段(矛盾的是,即使误导VARCHAR2(4000 CHAR)字段也有4000字节的限制在Oracle 11中。

我看到的替代方案是:

  • substr(NCLOB_COLUMN, 1, 4000) - 不好,4000个字符通常可以超过4000个字节
  • dbms_lob.substr(NCLOB_COLUMN, 4000, 1) - 不好,4000个字符通常可以超过4000个字节(另请参阅How to Copy Only First 4000 Characters from Oracle NCLOB to NVARCHAR2(4000) Value?

  • substr(NCLOB_COLUMN, 1, 1000) - 不好,我通常可以获得超过1000个字符

  • substrb(NCLOB_COLUMN, 1, 4000) - 没有好处,生成ORA-22998错误

还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

据推测,你不想最终得到一个部分角色 - 例如多字节字符的第一个字节 - 所以你可以获得前4000个字符(可能超过4000个字节),然后重复去除最后一个字符,直到字节数达到4000或更低:

create or replace function nclob_4k(p_nclob in nclob)
return varchar2
as
  l_varchar2 varchar2(32767);
begin
  l_varchar2 := dbms_lob.substr(p_nclob, 4000, 1);
  while lengthb(l_varchar2) > 4000 loop
    l_varchar2 := substr(l_varchar2, 1, length(l_varchar2) - 1);
  end loop;
  return l_varchar2;
end;
/

然后,您可以从表中选择nclob_4k(your_nclob_column),或将其用于插入。

答案 1 :(得分:0)

这在Oracle注释1571041.1中得到了回答,该注释建议创建这样的函数

function clob_substrb(p_clob in clob, p_length in pls_integer, p_position in pls_integer) return varchar2 is
begin
  return rtrim(substrb(dbms_lob.substr(p_clob, p_length, p_position), p_position, p_length));
end clob_substrb;