ORA-19011: 字符串缓冲区太小

Posted

技术标签:

【中文标题】ORA-19011: 字符串缓冲区太小【英文标题】:ORA-19011: Character string buffer too small 【发布时间】:2014-10-30 12:22:37 【问题描述】:

我写了一个存储过程SP_DEMAND_QRY。如果Demand 表中只有少数匹配行(5 或6),这将产生正确的值。但是,如果该表包含更多匹配行 (>6),那么当我执行它时会出现此错误:

Error:
-------
ORA-19011: Character string buffer too small
ORA-06512: at line 7

程序是:

create or replace PROCEDURE SP_DEMAND_QRY 
    (
      USR IN VARCHAR2  
    , OUT_CLOB OUT CLOB  
    ) AS 
BEGIN
    SELECT to_clob(XMLElement("DEMANDS",XMLAgg(XMLElement("Demand"
               ,XMLElement("DemandId",dmnd_id)
               ,XMLElement("CreatedBy",CREATED_BY)
               ,XMLElement("CreatedDate",CREATED_DATE)
               ,XMLElement("Designation",DESIGNATION)
               ,XMLElement("Experience",EXPERIENCE)
               ,XMLElement("PrimarySkill",PRIMARY_SKILL)
               ,XMLElement("SecondarySkill",SECONDARY_SKILL)
               ,XMLElement("OtherSkill",OTHER_SKILL)
               ,XMLElement("RequiredDate",REQUIRED_DATE)
               ,XMLElement("ProbablePercentage",PROBABLE_PERCENTAGE)
               ,XMLElement("CriticalFlag",CRITICAL_FLG)
               ,XMLElement("AssignedFlag",ASSIGNED_FLG)
               ,XMLElement("AccountName",ACCOUNT_NAME)
               ,XMLElement("OpportunityName",OPTY_NAME)
               ,XMLElement("AccountPOC",ACCNT_POC)
               ,XMLElement("COE",COE)
               ,XMLElement("DemandType",DEMAND_TYPE)
               ,XMLElement("Location",LOC)
               ,XMLElement("ExpectedRole",EXPECTED_ROLE)
               ,XMLElement("ConfidenceFactor",CONFIDENCE_FACTOR)
               ,XMLElement("EndDate",END_DT)
               ,XMLElement("HiringSO",HIRING_SO)
               ,XMLElement("HiringSOId",HIRING_SO_ID)
               ,XMLElement("Comments",COMMENTS)
           )))) 
    into OUT_CLOB
    from demand s
    where s.CREATED_BY=usr;
    --DBMS_output.put_line(OUT_CLOB);
END SP_DEMAND_QRY;

我做错了什么?

【问题讨论】:

不应该所有的双引号都是单引号吗? @VadimK。 - 不,它们是成为元素/标签名称的标识符,应该用双引号引起来。 (Docs) 【参考方案1】:

to_clob() 函数接受一个字符值,因此您可以将XMLElement() 返回的XMLType 隐式转换为varchar2;一旦 XML 的长度超过 4k(因为您在 SQL 上下文中),您就会收到该错误。

您可以改用XMLType 函数getCLobVal()

    SELECT XMLElement("DEMANDS",
                XMLAgg(XMLElement("Demand"
                            ,XMLElement( "DemandId",dmnd_id)
                        ,XMLElement( "CreatedBy",CREATED_BY)
...
    ,XMLElement("Comments",COMMENTS)
                       ))).getClobVal()
    into OUT_CLOB
    ...

因此,对to_clob() 的外部调用已被删除,取而代之的是对XMLElement().getClobVal() 的调用。 也使用大于 32k 的 XML 进行验证。

【讨论】:

谢谢,会检查并返回。

以上是关于ORA-19011: 字符串缓冲区太小的主要内容,如果未能解决你的问题,请参考以下文章

执行动态SQL报“字符串缓冲区太小”错误,请问各位高手怎么解决啊

Oracle 数据访问 ORA-06512: 字符串缓冲区太小

PLSQL - 字符串缓冲区太小

使用 wcsncpy_s 复制字符串时缓冲区太小

Oracle存储过程OUT CLOB返回错误字符串缓冲区太小

ORA-06502: 字符串缓冲区太小。即使字符串大小低于声明的大小限制