如何从 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) 个字段。
我看到的备选方案是:
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 错误
还有其他想法吗?
大概您不希望以部分字符结束 - 例如多字节字符的第一个字节 - 因此您可以获得前 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;
我想尽可能多地使用前 4000 个字符适合 4000 字节的最大字段(矛盾的是,4000 字节是即使是误导性 VARCHAR2 的限制Oracle 11 中的 (4000 个 CHAR) 个字段。
我看到的备选方案是:
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 错误
还有其他想法吗?
大概您不希望以部分字符结束 - 例如多字节字符的第一个字节 - 因此您可以获得前 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;