首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle NCLOB问题

Oracle NCLOB问题
EN

Stack Overflow用户
提问于 2010-07-26 14:17:45
回答 1查看 2.4K关注 0票数 1

我的职能如下:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION GetVarchar2 (iclCLOB IN Nvarchar2)
return NVARCHAR2
IS
cnuMAX_LENGTH Constant number := 32767 ;
nuLength Number := DBMS_LOB.getlength(iclCLOB);
sbBuffer Nvarchar2(32767);
begin
dbms_lob.read(iclCLOB,nuLength,1,sbBuffer);
return sbBuffer;
END;

当我这样称呼它时:

代码语言:javascript
复制
select GetVarChar2(text) from posts where postid = 'anId';

我知道这个错误:

ORA-22835:缓冲区太小,对于CLOB到CHAR或BLOB到原始转换(实际值: 6058,最大值:2000年)

22835。00000 -“缓冲区太小,对于CLOB到CHAR或BLOB到原始转换(实际:%s,最大值:%s)”

*原因:尝试将CLOB转换为CHAR或BLOB转换为RAW,其中

LOB尺寸大于CHAR和RAW的缓冲极限。

类型。

注意,如果字符长度语义对列有效,则宽度以字符为单位报告,否则宽度以字节为单位。

*行动:做以下工作之一

1.在执行转换之前,使LOB变小,

例如,在CLOB上使用SUBSTR

2.使用DBMS_LOB.SUBSTR将CLOB转换为CHAR或BLOB转换为RAW。

问题是,类型为NCLOB的posts表中的文本大小为6059字节。这很奇怪,因为当我不调用函数时,它运行得很好。也就是说,当我运行以下脚本时:

代码语言:javascript
复制
declare 
    iclCLOB nvarchar2(6100) := 'Here is the same 6059 bytes string';
    cnuMAX_LENGTH number := 32767 ;
    nuLength Number := DBMS_LOB.getlength(iclCLOB);
    sbBuffer Nvarchar2(32767);
    sbBuffer1 Nvarchar2(32767);
begin
    dbms_lob.read(iclCLOB,nuLength,1,sbBuffer);
    select GetVarChar2(text) into sbBuffer1 from posts where postid = 'anId';
end;

它运行时没有任何问题。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-29 05:21:10

NVARCHAR2在PL/SQL中可以是32767字节,但在SQL中只有4000个字节。另外,尝试将参数iclCLOB更改为NCLOB而不是NVARCHAR2 --隐式转换将导致问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3335683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档