เนื่อง
จากต้องการคิวรี่ข้อมูลในฐานข้อมูลของ 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
ผลจากการรันคำสั่งดังรูป