2016-08-19 65 views
2

我有一個PL/SQL過程,當前從XML服務獲取數據,並且只執行插入操作。Oracle PL/SQL對來自XML的數據使用Merge命令表

xml_data := xmltype(GET_XML_F('http://test.example.com/mywebservice'); 
--GET_XML_F gets the XML text from the site 

INSERT INTO TEST_READINGS (TEST, READING_DATE, CREATE_DATE, LOCATION_ID) 
SELECT round(avg(readings.reading_val), 2), 
    to_date(substr(readings.reading_dt, 1, 10),'YYYY-MM-DD'), SYSDATE, 
    p_location_id) 
FROM XMLTable(
    XMLNamespaces('http://www.example.com' as "ns1"), 
    '/ns1:test1/ns1:series1/ns1:values1/ns1:value' 
    PASSING xml_data 
    COLUMNS reading_val  VARCHAR2(50) PATH '.', 
      reading_dt  VARCHAR2(50) PATH '@dateTime') readings 
    GROUP BY substr(readings.reading_dt,1,10), p_location_id; 

我希望能夠插入或更新使用事件MERGE語句,它需要在同一天被重新運行發現添加的記錄數據。我正在使用下面的代碼在其他過程中執行此操作。

MERGE INTO TEST_READINGS USING DUAL 
ON (LOCATION_ID = p_location_id AND READING_DATE = p_date) 
    WHEN NOT MATCHED THEN INSERT 
     (TEST_reading_id, site_id, test, reading_date, create_date) 
     VALUES (TEST_readings_seq.nextval, p_location_id, 
       p_value, p_date, SYSDATE) 
    WHEN MATCHED THEN UPDATE 
     SET TEST = p_value; 

事實上,我從XMLTable中拉它是拋出我。有沒有辦法從XMLTable中獲取數據,同時仍然使用(非常乾淨)的合併語法?我會事先刪除數據並重新導入或使用大量的條件語句,但我希望儘可能避免這樣做。

+0

創建一個從你的SELECT語句 –

回答

1

難道你不能簡單地把你的SELECT轉換爲MERGE聲明嗎?

我相信,這應該看起來更不像是:

MERGE INTO TEST_READINGS USING (
    SELECT 
     ROUND(AVG(readings.reading_val), 2) AS test 
     ,TO_DATE(SUBSTR(readings.reading_dt, 1, 10),'YYYY-MM-DD') AS reading_date 
     ,SYSDATE AS create_date 
     ,p_location_id AS location_id 
    FROM 
     XMLTable(
      XMLNamespaces('http://www.example.com' as "ns1") 
      ,'/ns1:test1/ns1:series1/ns1:values1/ns1:value' 
      PASSING xml_data 
     COLUMNS 
      reading_val  VARCHAR2(50) PATH '.', 
      reading_dt  VARCHAR2(50) PATH '@dateTime' 
     ) readings 
    GROUP BY 
    SUBSTR(readings.reading_dt,1,10) 
    ,p_location_id 
) readings ON (
    LOCATION_ID = readings.location_id 
    AND READING_DATE = readings.reading_date 
) 
WHEN NOT MATCHED THEN 
    ... 
WHEN MATCHED THEN 
    ... 
; 
+0

這一工作的景色。這是我從字面上試圖以各種方式去做的情況之一,除了明顯的情況。謝謝! –

+0

我知道你的意思。有時最明顯的解決方案是想到的最後一個解決方案。 :) – AndrewMcCoist