บทนำ
Blog นี้สำรวจ Methods หลายอย่างสำหรับจัดการ XML Data ใน Oracle® PL/SQL เรียนรู้เพิ่มเติมเกี่ยวกับ Database Services ของเรา
ถ้าคุณต้องการ Convert XML Data จาก XML File ให้เป็น Oracle PL/SQL Rows และ Columns มี Options:
- Load XML File เข้า XML Table แล้วค่อย Parse
- Parse XML File โดยตรงโดยไม่ Load เข้า XML Table
เพื่อ Load XML Data เข้า Oracle Table ใช้ Options เช่น SQLLOADER, utl_file, หรือ XML CLOB หลัง Load เข้า Table แล้ว ต้อง Extract ค่าจาก XML Tag แต่ละอัน ใช้ Built-in Functions ของ Oracle เช่น XMLELEMENT, XMLAGG, XMLTABLE, XMLSEQUENCE, และ EXTRACTVALUE
Main Built-in Function ที่ใช้คือ EXTRACT แสดงในภาพ:
Image Source: https://docs.oracle.com/cd/B19306_01/server.102/b14200/img/extract_xml.gif
Example File
เพื่อสำรวจ Options ใช้ File Test.xml เข้าถึงใน Database ผ่าน Directory DBA ที่ Define ใน Oracle ใช้ XX_UTL_DIR เป็น Reference Directory (คุณสามารถใช้ Directory ของคุณเองได้)
Test.xml มีเนื้อหา:
<?xml version = '1.0' encoding = 'UTF-8'?>
<UANotification xmlns="https://www.test.com/UANotification">
<NotificationHeader>
<Property name="ErrorMessage" value="User Data Invalid"/>
<Property name="SPSDocumentKey" value="11111111111"/>
<Property name="AppKey" value="22222222"/>
<Property name="FileName" value="SH201701181418.61W"/>
<Property name="SenderName" value="Test"/>
<Property name="ReceiverName" value="Integrated Supply Network"/>
<Property name="DocumentType" value="856"/>
<Property name="SourceDataType" value="XML"/>
<Property name="DestinationDataType" value="FEDS"/>
<Property name="XtencilNet" value="shFedsWrite"/>
<Property name="PreviousMaps" value="shFedsWrite]"/>
</NotificationHeader>
<FINotification xmlns="https://www.test.com/fileIntegration">
<ServiceResult>
<DataError>
<Message>Invalid data test 1</Message>
</DataError>
<DataError>
<Message>Invalid data test 2</Message>
</DataError>
</ServiceResult>
</FINotification>
</UANotification>
Approach แรก: Load XML File เข้า XML Table แล้ว Parse
สร้าง Table ใน Oracle ที่มี Column Data Type XMLTYPE
CREATE TABLE xml_tab (
File_name varchar2(100),
xml_data XMLTYPE );
Insert Data จาก Test.xml เข้า xml_tab:
INSERT INTO xml_tab VALUES (
'Test.xml',
XMLTYPE (BFILENAME ('XX_UTL_DIR', 'Test.xml'), NLS_CHARSET_ID ('AL32UTF8') ));
INSERT Statement นี้ Insert Data ของ File Test.xml เข้า Field xml_data ของ Table xml_tab หลัง INSERT เสร็จ XML Data พร้อมใน Table xml_tab เพื่ออ่าน Data ใน SELECT Query ใช้ SELECT Statements ต่อไปนี้
อ่าน Text ของ Tag Message ที่อยู่ใต้ Parent Tag DataError:
SELECT EXTRACT (VALUE (a1), '/DataError/Message/text()', 'xmlns="https://www.test.com/fileIntegration') msg
FROM xml_tab,
TABLE ( XMLSEQUENCE (
EXTRACT ( xml_data,
'/UANotification/ns2:FINotification/ns2:ServiceResult/ns2:DataError',
'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
WHERE file_name = 'Test.xml';
อ่าน property name และ Value:
SELECT EXTRACTVALUE (VALUE (a1), '/Property/@name', 'xmlns="https://www.test.com/UANotification') attribute,
EXTRACTVALUE (VALUE (a1), '/Property/@value', 'xmlns="https://www.test.com/UANotification') VALUE
FROM xml_tab,
TABLE ( XMLSEQUENCE (
EXTRACT ( xml_data,
'/UANotification/NotificationHeader/Property',
'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
WHERE file_name = 'Test.xml';
Approach ที่สอง: Parse XML File โดยตรงโดยไม่ Load เข้า XML Table
ถ้าต้องการ Parse Test.xml โดยตรงโดยไม่ Load เข้า Oracle Table ใช้ SELECT Statement นี้:
SELECT EXTRACTVALUE (VALUE (a1), '/Property/@name', 'xmlns="https://www.test.com/UANotification') attribute,
EXTRACTVALUE (VALUE (a1), '/Property/@value', 'xmlns="https://www.test.com/UANotification') value
FROM TABLE ( XMLSEQUENCE (
EXTRACT (
xmltype(BFILENAME ('XX_UTL_DIR', 'Test.xml'), NLS_CHARSET_ID ('AL32UTF8')),
'/UANotification/NotificationHeader/Property',
'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
Wrap Up
ทั้ง 2 Methods ให้ Final Output เหมือนกัน Approach แรกเป็น 3 Steps ต้องใช้ Code:
- Create Oracle Table
- Insert XML File Data เข้า Table ที่สร้าง
- เขียน SELECT Statement Extract Values จาก Table
Option ที่สองเป็น Single-step Process เขียน SELECT Statement ได้ Result ทันที
สรุป
ทั้ง 2 Options ใช้ได้ แต่ถ้าต้องการ Store XML File ใน Oracle ไว้ Reference ภายหลัง ควรใช้ Approach แรก เพราะ Data Persist ใน Table เข้าถึงได้ตลอดเวลา
Option ที่สอง Parse Data โดยตรง แต่ Original XML File Data ไม่สามารถ Access ในอนาคตได้ เพราะ Option นี้ไม่ Store XML Content ใน Oracle
ใช้แท็บ Feedback เพื่อแสดงความคิดเห็นหรือถามคำถาม
เพิ่มประสิทธิภาพสภาพแวดล้อมด้วยบริการผู้เชี่ยวชาญ
ผู้เชี่ยวชาญ Rackspace Application Services (RAS) ให้บริการ Professional และ Managed Services ครอบคลุม Portfolio หลากหลาย:
- Platform สำหรับ eCommerce และ Digital Experience
- Enterprise Resource Planning (ERP)
- Business Intelligence
- Salesforce Customer Relationship Management (CRM)
- Databases
- Email Hosting และ Productivity
เรามอบ:
- Unbiased Expertise: ลดความซับซ้อนและนำทางการ Modernization เน้นความสามารถที่สร้างคุณค่าทันที
- Fanatical Experience™: รวมแนวทาง Process First. Technology Second.® พร้อม Technical Support ให้ Soluation ครบวงจร
- Unrivaled Portfolio: ประยุกต์ประสบการณ์ Cloud มากมายช่วยเลือกและ Deploy เทคโนโลยีที่เหมาะสมบน Cloud ที่เหมาะสม
- Agile Delivery: ตรงจุดที่คุณอยู่ในการเดินทางและทำให้ความสำเร็จของเราสอดคล้องกับคุณ
แชทตอนนี้เพื่อเริ่มต้น