ORA-19011:字符串缓冲区太小
问题描述:
我写了一个存储过程SP_DEMAND_QRY
。如果Demand
表中只有少数匹配的行(5或6),则会生成正确的值。但是,如果表中包含更多的匹配行(> 6)然后我得到这个错误,当我执行它:ORA-19011:字符串缓冲区太小
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;
我在做什么错?
答
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()
一个电话所取代。 以XML大于32k验证。
+0
谢谢,将检查它并取回。 – Avijit 2014-10-30 15:19:04
是不是所有的双引号都是单引号? – 2014-10-30 19:18:52
@VadimK。 - 不,它们是成为元素/标记名称的标识符,应该用双引号。 ([文档](http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions242.htm#SQLRF06168)) – 2014-10-31 10:15:22