为列分配值 - xmltable

时间:2015-08-25 14:24:24

标签: xml oracle

我从包含xml文件的表中提取一些数据。 我正在使用的查询如下,它工作正常。

SELECT Item_ID,
    MAX(Start_Q),
    Sum(Sold),   
    Sum(Transferred),
    MIN(End_Q)
FROM your_table
WHERE  [Date] BETWEEN '20-07-2015' AND '30-08-2015'
GROUP BY Item_ID
ORDER BY Item_ID

我想将这些字段插入表中,但我还想更新一个表字段,其值不在XML文件中。

我尝试使用以下代码:

select RecUid.CD_UID,
   Abst2.*
from   testtable2 t
   cross join xmltable(xmlnamespaces(default     'xxxxxxxxxxxx'),
                       'records/REC'
                       passing t.xml_file 
                       columns CD_UID varchar2(200) path 'UID',
                               --names xmltype path 'static_data/summary'
                               Abstract xmltype path 'static_data/keywords'
                       ) RecUid
   cross join xmltable(--xmlnamespaces(default 'http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord'),
                       'keywords/keyword'
                       passing RecUid.Abstract
                       columns keyword varchar2(200) path '.'
                       ) Abst2;

但显然它不起作用。

我们正在运行:'Oracle Database 11g企业版11.2.0.4.0 64位生产'

如何为FLAG字段指定值?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您所做的只是为列分配文字值,我只会在选择列表中而不是在xmltable中进行操作,例如:

INSERT INTO WOS_DM_KEYWORD (CD_UID,
                            CD_KEYWORD,
                            FLAG)
select RecUid.CD_UID,
       Abst2.cd_keyword,
       1 flag
from   testtable2 t
       cross join xmltable(xmlnamespaces(default 'http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord'),
                           'records/REC'
                           passing t.xml_file 
                           columns CD_UID varchar2(200) path 'UID',
                                   Abstract xmltype path 'static_data/fullrecord_metadata/keywords'
                          ) RecUid
       cross join xmltable(xmlnamespaces(default 'http://scientific.thomsonreuters.com    /schema/wok5.4/public/FullRecord'),
                           'keywords/keyword'
                           passing RecUid.Abstract
                           columns CD_KEYWORD varchar2(200) path '.'
                           )  Abst2;

答案 1 :(得分:1)

您收到的ORA-00902错误是因为您没有提供标志列的数据类型;这有效:

columns     CD_KEYWORD varchar2(200) path '.',
            FLAG varchar2(1) path '1'

或者更有可能:

columns     CD_KEYWORD varchar2(200) path '.',
            FLAG number path '1'

但正如@Boneist所示,你可以在选择列表中提供固定的标志值,而不是试图将其强制转换为XML:

INSERT INTO WOS_DM_KEYWORD
    (
      CD_UID
    , CD_KEYWORD
    , FLAG)
select RecUid.CD_UID
 , Abst2.CD_KEYWORD
 , '1'
from testtable2 t
cross join  xmltable(xmlnamespaces(default 'http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord'),
'records/REC'
passing t.xml_file 
columns     CD_UID varchar2(200) path 'UID',
          Abstract xmltype path 'static_data/fullrecord_metadata/keywords'
        ) RecUid
cross join xmltable(xmlnamespaces(default 'http://scientific.thomsonreuters.com    /schema/wok5.4/public/FullRecord'),
'keywords/keyword'
passing RecUid.Abstract
columns     CD_KEYWORD varchar2(200) path '.'
        )  Abst2
;

但如果标记字段为数字,则再次使用1而不是'1'