การแก้ปัญหา result of string concatenation is too long ใน Oracle
8 สิงหาคม พ.ศ. 2559 สุรเดช ศิริสูตร สำนักคอมพิวเตอร์ เปิดอ่านแล้ว 2 ครั้ง

          เนื่อง จากต้องการคิวรี่ข้อมูลในฐานข้อมูลของ Oracle โดยต้องการนำข้อมูลแต่ละฟิลด์มาต่อกันเป็นฟิลด์เดียว โดยใช้คำสั่ง || ' ' || ต่อ ฟิลด์กันให้ครบทุกฟิลด์ ดังต่อไปนี้

SELECT

(SUBAT_YEAR || ' ' || FAC_ID || ' ' || SUBAT_PERIOD || ' ' || SUBAT_NAME || ' ' || SUBAT_DETAIL || ' ' || SUBAT_CONTROL || ' ' || SUBAT_ASSESSCON || ' ' || SUBAT_RISK || ' ' || SUBAT_RECONTROL || ' ' || SUBAT_PERIOD) as long_text

FROM

    INCTSUBASSESSTWO

 

เมื่อทำการรันคำสั่งแล้วทำให้พบปัญหา คือ ข้อมูลที่นำมาต่อกันนั้นรวมกันแล้วยาวมาก ซึ่งเกินขนาดที่รองรับได้ที่ 4000 byte ดังรูป

แนวทางการแก้ปัญหา

          ค้นหากรณีศึกษา แล้วพบว่ามีการแก้ปัญหาดังกล่าว ลองมาประยุกต์ใช้กับข้อมูลที่เราต้องการซึ่งพบว่าสามารถรันคำสั่งได้ ตามต้องการ

ตัวอย่างโค๊ด

SELECT

SUBAT_ID,

(RTRIM(xmlagg(XMLELEMENT(E, SUBAT_YEAR, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, FAC_ID, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_PERIOD, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_NAME, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_DETAIL, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_CONTROL, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_ASSESSCON, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_RISK, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_RECONTROL, '' ).EXTRACT('//text()')).GetClobVal())|| '' ||

RTRIM(xmlagg(XMLELEMENT(E, SUBAT_PERIOD, '' ).EXTRACT('//text()')).GetClobVal()) )AS very_long_text

FROM INCTSUBASSESSTWO

GROUP BY SUBAT_ID

ORDER BY SUBAT_ID

 

ผลจากการรันคำสั่งดังรูป