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

How to take the longest string that will fit in a VARCHAR2(4000) from a NCLOB?

我想尽可能多地使用前 4000 个字符适合 4000 字节的最大字段(矛盾的是,4000 字节是即使是误导性 VARCHAR2 的限制Oracle 11 中的 (4000 个 CHAR) 个字段。

我看到的备选方案是:

还有其他想法吗?

大概您不希望以部分字符结束 - 例如多字节字符的第一个字节 - 因此您可以获得前 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;
/

然后您可以 select nclob_4k(your_nclob_column) 来自您的 table,或将其用于插入。

这在 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;