为列指定一个值-xmltable
我正在从包含xml文件的表中提取一些数据。 我使用的查询如下所示,运行良好为列指定一个值-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
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”
。我仍然会在外部选择列表中这样做…啊哈!这是我唯一不想尝试的事情,噢!我也同意,;我也会在外面选择!