Blog này khám phá một vài phương pháp xử lý dữ liệu XML trong Oracle® PL/SQL. Tìm hiểu thêm về dịch vụ database của chúng tôi.
Nếu bạn muốn chuyển đổi dữ liệu XML từ file XML thành hàng và cột Oracle PL/SQL, các tùy chọn sau có sẵn:
- Load file XML vào XML table và sau đó parse nó.
- Parse trực tiếp file XML mà không load vào XML table.
Để load dữ liệu XML vào bảng Oracle, dùng các tùy chọn như SQLLOADER, utl_file, hoặc XML CLOB. Sau khi load dữ liệu vào bảng, bạn cần trích xuất giá trị từ mỗi XML tag. Để trích xuất dữ liệu XML, sử dụng các built-in function do Oracle cung cấp, như XMLELEMENT, XMLAGG, XMLTABLE, XMLSEQUENCE, và EXTRACTVALUE.
Built-in function chính được dùng là EXTRACT, được hiển thị trong hình sau:
Nguồn hình ảnh: https://docs.oracle.com/cd/B19306_01/server.102/b14200/img/extract_xml.gif
File ví dụ
Để khám phá các tùy chọn này chi tiết, ví dụ trong bài này dùng file, Test.xml. Để truy cập file trong database, dùng thư mục DBA, được định nghĩa trong Oracle. Các ví dụ dùng XX_UTL_DIR làm thư mục tham chiếu. Bạn có thể dùng thư mục của bạn thay thế.
Test.xml có nội dung sau:
<?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>
Phương pháp thứ nhất: Load file XML vào XML table và sau đó parse nó
Đầu tiên, tạo một bảng trong Oracle bao gồm cột với kiểu dữ liệu XMLTYPE.
Ví dụ, dùng mã sau để tạo bảng:
CREATE TABLE xml_tab ( File_name varchar2(100), xml_data XMLTYPE );
Tiếp theo, chèn dữ liệu từ Test.xml vào xml.tab bằng cách dùng lệnh sau:
INSERT INTO xml_tab VALUES ( ‘Test.xml’, XMLTYPE (BFILENAME ('XX_UTL_DIR', ‘Test.xml’), NLS_CHARSET_ID ('AL32UTF8') ));
Câu INSERT trước chèn dữ liệu của file Test.xml vào trường xml_data của bảng xml_tab. Sau khi INSERT hoàn tất, dữ liệu XML có sẵn trong bảng xml_tab. Để đọc dữ liệu trong truy vấn SELECT, dùng các câu SELECT được mô tả tiếp theo.
Để đọc text của tag Message có sẵn dưới parent tag DataError, dùng lệnh SQL sau:
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';
Để đọc property name và giá trị của nó, dùng lệnh SQL sau:
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';
Phương pháp thứ hai: Parse trực tiếp file XML mà không load nó vào XML table
Nếu bạn muốn parse trực tiếp Test.xml mà không load nó vào bảng Oracle, bạn có thể dùng câu SELECT sau:
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
Tóm tắt
Cả hai phương pháp parse dữ liệu XML được mô tả trong bài này cho bạn cùng output cuối cùng. Phương pháp thứ nhất là quy trình ba bước, yêu cầu các đoạn mã sau:
- Tạo bảng Oracle.
- Chèn dữ liệu file XML vào bảng đã tạo.
- Viết câu SELECT để trích xuất giá trị từ bảng.
Tùy chọn thứ hai là quy trình một bước nơi bạn viết câu SELECT và nhận kết quả mong muốn.
Kết luận
Cả hai tùy chọn đều hoạt động, nhưng nếu bạn cần lưu file XML trong Oracle để tham khảo sau này, bạn nên dùng phương pháp thứ nhất vì dữ liệu tồn tại trong bảng để tham khảo sau này và bạn có thể truy cập bất kỳ lúc nào.
Bằng cách chọn phương pháp thứ hai, bạn có thể parse trực tiếp dữ liệu. Tuy nhiên, với tùy chọn này, dữ liệu file XML gốc không thể truy cập trong tương lai vì tùy chọn này không bao giờ lưu nội dung file XML trong Oracle.
Sử dụng tab Feedback để đưa ra bình luận hoặc đặt câu hỏi.
Tối ưu môi trường của bạn với quản trị, quản lý và cấu hình chuyên nghiệp
Các chuyên gia Dịch vụ ứng dụng của Rackspace (RAS) cung cấp các dịch vụ chuyên nghiệp và được quản lý sau đây trên danh mục ứng dụng rộng:
- Nền tảng eCommerce và Trải nghiệm số
- Quản trị nguồn lực doanh nghiệp (ERP)
- Business Intelligence
- Salesforce Quản trị quan hệ khách hàng (CRM)
- Databases
- Lưu trữ Email và Năng suất
Chúng tôi cung cấp:
- Chuyên môn khách quan: Chúng tôi đơn giản hóa và hướng dẫn hành trình hiện đại hóa của bạn, tập trung vào các khả năng mang lại giá trị ngay lập tức.
- Fanatical experience™: Chúng tôi kết hợp phương pháp Process first. Technology second.® với hỗ trợ kỹ thuật chuyên dụng để cung cấp giải pháp toàn diện.
- Danh mục không đối thủ: Chúng tôi áp dụng kinh nghiệm đám mây rộng lớn để giúp bạn chọn và triển khai công nghệ phù hợp trên đám mây phù hợp.
- Giao hàng Agile: Chúng tôi gặp gỡ bạn ở bất kỳ đâu trong hành trình của bạn và điều chỉnh thành công của chúng tôi với của bạn.
Chat ngay để bắt đầu.