为列指定一个值-xmltable

为列指定一个值-xmltable,xml,oracle,Xml,Oracle,我正在从包含xml文件的表中提取一些数据。 我使用的查询如下所示,运行良好 select RecUid.CD_UID, Abst2.* from testtable2 t cross join xmltable(xmlnamespaces(default 'xxxxxxxxxxxx'), 'records/REC' passing t.xml_file

我正在从包含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;
我想将这些字段插入到表中,但我还想用XML文件中没有的值更新表字段

我已尝试使用以下代码:

INSERT INTO WOS_DM_KEYWORD
    (
      CD_UID
    , CD_KEYWORD
    , FLAG)
select RecUid.CD_UID
 , Abst2.*
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 '.',
            FLAG '1'
        )  Abst2
;
但很明显,它不起作用

我们正在运行:“Oracle Database 11g Enterprise Edition 11.2.0.4.0 64位生产”

如何为标志字段赋值


谢谢大家!

如果您所做的只是为一个列指定一个文本值,我只会将它链接到选择列表中,而不是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;

您得到的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'

为什么“显然”-您没有告诉我们发生了什么。是否始终要将值1分配给标志列?是的,很抱歉,它不起作用,因为我得到了错误
错误报告-SQL错误:ORA-00902:无效数据类型00902。00000-“无效数据类型”*原因:*操作:
,由于这是一个标志,我希望将其始终设置为1。我认为您只能在xmltable中这样分配数字文本。至少,我无法找到让文字列返回字符串的方法,例如“abc”。如果您知道如何做到这一点,我会很感兴趣。@Boneist-双引号:
some_col varchar2(3)path“abc”
。我仍然会在外部选择列表中这样做…啊哈!这是我唯一不想尝试的事情,噢!我也同意,;我也会在外面选择!