我想把前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错误还有其他想法吗?
答案 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;