2016-08-19 51 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