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

Oracle11g 如何从NCLOB中获取适合VARCHAR2(4000)的最长字符串?,oracle11g,clob,Oracle11g,Clob,我想尽我所能将前4000个字符中的最多字符放入4000字节的最大字段。自相矛盾的是,即使对于Oracle 11中的24000个字符字段,4000字节也是一个限制 我看到的备选方案是: substrNCLOB_列,1,4000-不好,4000个字符通常可以超过4000字节 dbms_lob.substrNCLOB_列,4000,1-不好,4000个字符通常可以超过4000字节请参见 substrNCLOB_列,1,1000-不好,我通常可以得到远远超过1000个字符 substrbNCLOB_列,

我想尽我所能将前4000个字符中的最多字符放入4000字节的最大字段。自相矛盾的是,即使对于Oracle 11中的24000个字符字段,4000字节也是一个限制

我看到的备选方案是:

substrNCLOB_列,1,4000-不好,4000个字符通常可以超过4000字节 dbms_lob.substrNCLOB_列,4000,1-不好,4000个字符通常可以超过4000字节请参见

substrNCLOB_列,1,1000-不好,我通常可以得到远远超过1000个字符

substrbNCLOB_列,14000-不好,生成ORA-22998错误
还有其他想法吗?

您可能不想以部分字符结束—例如,多字节字符的第一个字节—因此您可以获得可能超过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_4ku_nclob_列,或将其用于插入。

Oracle note 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;

您将如何为Oracle 11更改此选项?我相信32767不会工作。我在11gR2中测试了这个。varchar232767在PL/SQL中是可以的,我认为一直都是这样;在12c中,SQL限制从4000增加到32k。不过,我使用了假数据,强制在4k标记周围使用多字节字符,以确保它能够正常工作;使用真实数据进行测试可能会带来一些问题。我相信你能为这个函数想出一个更好的名字!