Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

Mastering XML Parsing ใน Oracle PL/SQL: เทคนิคและ Best Practices ที่มีประสิทธิภาพ

บทนำ

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 แสดงในภาพ:

Mastering XML Parsing ใน Oracle PL/SQL: เทคนิคและ Best Practices ที่มีประสิทธิภาพ

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:

  1. Create Oracle Table
  2. Insert XML File Data เข้า Table ที่สร้าง
  3. เขียน 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: ตรงจุดที่คุณอยู่ในการเดินทางและทำให้ความสำเร็จของเราสอดคล้องกับคุณ

แชทตอนนี้เพื่อเริ่มต้น