最近公司做的幾個項目,都是通過EBS與外部系統的Web Service進行數據的交互,而調用Web Service的時候,我們所傳送的數據,都是按照約定的XML格式來傳遞,所以EBS接收到數據之后,需要解析該XML數據。以下為此次項目中通過PLSQL解析XML數據的例子。
假設約定的XML格式如下所示:
此處為子庫轉移的數據,從A子庫把某個物料轉移到B子庫,而由於物料啟用批次的關系,在轉移的時候,可能存在多個批次,所以XML結構也就有了層次結構。PLSQL代碼如下所示:
DECLARE
l_xml xmltype;
CURSOR cur_line(l_xml xmltype) IS
SELECT TRIM(extractvalue(VALUE(l), 'LINES/LINE_ID')) LINE_ID
,TRIM(extractvalue(VALUE(l), 'LINES/SCHEDULE_ARRIVAL_DATE')) SCHEDULE_ARRIVAL_DATE
,TRIM(extractvalue(VALUE(l), 'LINES/SRC_SUBINVENTORY')) SRC_SUBINVENTORY
,TRIM(extractvalue(VALUE(l), 'LINES/DEST_SUBINVENTORY')) DEST_SUBINVENTORY
,TRIM(extractvalue(VALUE(l), 'LINES/COMMENTS')) COMMENTS
,TRIM(extractvalue(VALUE(l), 'LINES/TRANSACTION_TYPE_ID')) TRANSACTION_TYPE_ID
,TRIM(extractvalue(VALUE(l), 'LINES/TXN_ACTION_CODE')) TXN_ACTION_CODE
,TRIM(extractvalue(VALUE(l), 'LINES/INVENTORY_ITEM_ID')) INVENTORY_ITEM_ID
,TRIM(extractvalue(VALUE(l), 'LINES/REQUIRE_QTY')) REQUIRE_QTY
,TRIM(extractvalue(VALUE(l), 'LINES/ACTUAL_SHIP_QTY')) ACTUAL_SHIP_QTY
,TRIM(extractvalue(VALUE(l), 'LINES/TRANSACTION_DATE')) TRANSACTION_DATE
,TRIM(extractvalue(VALUE(l), 'LINES/CREATED_BY')) CREATED_BY
,TRIM(extractvalue(VALUE(l), 'LINES/CREATION_DATE')) CREATION_DATE
,extract(VALUE(l), 'LINES/DETAIL/LINE') lots
FROM TABLE(xmlsequence(extract(l_xml, 'TRANSFER/LINES'))) l;
CURSOR cur_lot(l_lot xmltype) IS
SELECT TRIM(extractValue(VALUE(lot), 'LINE/LOT_NUMBER')) lot_number
,TRIM(extractValue(VALUE(lot), 'LINE/LOT_QTY')) lot_qty
,TRIM(extractValue(VALUE(lot), 'LINE/TRUCK_NO')) truck_no
,TRIM(extractValue(VALUE(lot), 'LINE/DRIVER_NAME')) driver_name
FROM TABLE(xmlsequence(extract(l_lot, 'LINE'))) lot;
BEGIN
SELECT xmltype(p_request_data) INTO l_xml FROM dual;
FOR x IN cur_line(l_xml) LOOP
FOR y IN cur_lot(x.lots) LOOP
NULL;
END LOOP;
END LOOP;
END;
此處代碼無法直接運行,因為需要輸入有參數沒有定義,大概的使用方法就是上面所示。
另外,此處是針對XML結構比較復雜,有多層結構,如果只是扁平的單行結構的話,則處理方法類似,且更加簡單了。
轉載請注明出處……

