2014-10-30 773 views
1

我寫了一個存儲過程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; 

我在做什麼錯?

+0

是不是所有的雙引號都是單引號? – 2014-10-30 19:18:52

+0

@VadimK。 - 不,它們是成爲元素/標記名稱的標識符,應該用雙引號。 ([文檔](http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions242.htm#SQLRF06168)) – 2014-10-31 10:15:22

回答

4

to_clob()函數需要一個字符值,因此您有從XMLElement()返回的XMLTypevarchar2的隱式轉換;一旦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