您可以使用 XQuery 更新并将代码设置为完整值的第一个字符(假设这不是一个过度设计的示例);使用静态字符串:
select xmlquery (
'copy $n := $o
modify (
for $g in $n/Lists/list
return replace value of node $g/GenderCode with fn:substring($g/Gender, 1, 1)
)
return $n'
passing xmltype('<Lists>
<list>
<Gender>Male</Gender>
<GenderCode>X</GenderCode>
</list>
<list>
<Gender>Female</Gender>
<GenderCode>X</GenderCode>
</list>
</Lists>') as "o"
returning content)
from dual;
XMLQUERY('COPY$N:=$OMODIFY(FOR$GIN$N/LISTS/LISTRETURNREPLACEVALUEOFNODE$G/GENDER
--------------------------------------------------------------------------------
<Lists><list><Gender>Male</Gender><GenderCode>M</GenderCode></list><list><Gender
>Female</Gender><GenderCode>F</GenderCode></list></Lists>
或者可能更有用的是,将存储在表中的值更新为 XMLType:
-- create and populate dummy table
create table your_table (xml_column) as
select xmltype('<Lists>
<list>
<Gender>Male</Gender>
<GenderCode>X</GenderCode>
</list>
<list>
<Gender>Female</Gender>
<GenderCode>X</GenderCode>
</list>
</Lists>')
from dual;
update your_table
set xml_column = xmlquery (
'copy $n := $o
modify (
for $g in $n/Lists/list
return replace value of node $g/GenderCode with fn:substring($g/Gender, 1, 1)
)
return $n'
passing xml_column as "o"
returning content
);
1 row updated.
如果您的等效 xml_column 实际上存储为 varchar2 或 CLOB,那么只需将其包装起来:
passing xmltype(xml_column) as "o"
然后你可以看到值已经按照你想要的方式更新了:
select xml_column from your_table;
XML_COLUMN
--------------------------------------------------------------------------------
<Lists>
<list>
<Gender>Male</Gender>
<GenderCode>M</GenderCode>
</list>
<list>
<Gender>Female</Gender>
<GenderCode>F</GenderCode>
</list>
</Lists>
如果需要从不同的表中查找代码,您可以使用fn:collection with oradb 从 XMLQuery 中访问表:
-- undo previous update to go back to X codes
rollback;
-- look-up table
create table genders (gender, gendercode) as
select 'Male', 'M' from dual
union all
select 'Female', 'F' from dual;
update your_table
set xml_column = xmlquery (
'copy $n := $o
modify (
for $g in $n/Lists/list, $c in fn:collection("oradb:/YOUR_SCHEMA/GENDERS")
where $c/ROW/GENDER = $g/Gender
return replace value of node $g/GenderCode with $c/ROW/GENDERCODE
)
return $n'
passing xml_column as "o"
returning content
);
1 row updated.
得到相同的结果:
select xml_column from your_table;
XML_COLUMN
--------------------------------------------------------------------------------
<Lists>
<list>
<Gender>Male</Gender>
<GenderCode>M</GenderCode>
</list>
<list>
<Gender>Female</Gender>
<GenderCode>F</GenderCode>
</list>
</Lists>