【问题标题】:Assign a value to a column - xmltable为列赋值 - xmltable
【发布时间】:2015-08-25 23:24:43
【问题描述】:

我正在从包含 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 64bit Production'

如何为 FLAG 字段赋值?

谢谢!

【问题讨论】:

  • 为什么'显然' - 你还没有告诉我们会发生什么。是否总是要将值 1 分配给标志列?
  • 是的,对不起,它不起作用,因为我收到错误 Error report - SQL Error: ORA-00902: invalid datatype 00902. 00000 - "invalid datatype" *Cause: *Action: 因为它是一个标志,所以我想将其始终设置为 1。

标签: xml oracle


【解决方案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'

【讨论】:

  • 我认为您只能像这样在 xmltable 中分配数字文字。至少,我无法找到使文字列返回字符串的方法,例如。 'ABC'。如果您知道如何做到这一点,将会很感兴趣。
  • @Boneist - 带双引号:some_col varchar2(3) path '"abc"'。不过,我仍然会在外部选择列表中执行此操作...
  • 啊哈!这是我没想过要尝试的一件事,哦!另外,我同意;我也会在外部选择中这样做!
【解决方案2】:

如果您所做的只是为列分配文字值,我只会将其放入选择列表而不是 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    相关资源
    最近更新 更多