如何在 plsql 的 varchar2 字段中的 xml 节点末尾插入“1”?

Posted

技术标签:

【中文标题】如何在 plsql 的 varchar2 字段中的 xml 节点末尾插入“1”?【英文标题】:How to insert a '1' at the end of an xml node in a varchar2 field in plsql? 【发布时间】:2018-02-23 14:10:47 【问题描述】:

我试图在包含 xml 数据的 varchar2 字段中的 referenceid 节点末尾插入一个“1”。我很难理解这是否可能。这是字段数据的示例。

<?xml version="1.0"?><RECEIVE_PO_005><CNTROLAREA><BSR><VERB>RECEIVE</VERB>
<NOUN>PO</NOUN><REVISION>005</REVISION></BSR><SENDER><LOGICALID>2</LOGICALID>
<COMPONENT>-</COMPONENT><TASK>RECEIVEPO</TASK>
<REFERENCEID>20241920x32255420001-0047x4210743</REFERENCEID>....................

【问题讨论】:

【参考方案1】:

an Oracle built-in function, UPDATEXML() 允许您执行此操作。因为您想附加到现有属性而不是覆盖它,所以需要额外使用extract() 来获取文本值:

update x23 
set xmlt =
   UPDATEXML(xmlt, '/RECEIVE_PO_005/CNTROLAREA/SENDER/REFERENCEID/text()',
     extract(xmlt, '/RECEIVE_PO_005/CNTROLAREA/SENDER/REFERENCEID/text()')||'-1')
where id = 1;

连接-1只是为了更容易发现:)

路径可能不适合您:我不得不猜测您的整个文档是什么样的for the LiveSQL demo (free OTN account required)。


我注意到您的问题是您将 XML 存储在 varchar2 列中,而不是作为 xmltype。使用 Oracle XMLType 列来存储 XML 是一个非常好的主意,因为它提供了各种简洁的功能。像UPDATEXML(),它不适用于纯字符串。要使其与 varchar2 列一起使用,您需要将该列强制转换为 xmltype,如下所示:

update x23 
set xmlt =
   UPDATEXML(xmlType(xmlt), '/RECEIVE_PO_005/CNTROLAREA/SENDER/REFERENCEID/text()',
     extract(xmlType(xmlt), '/RECEIVE_PO_005/CNTROLAREA/SENDER/REFERENCEID/text()') || '-1')
where id = 1;

【讨论】:

@jck7282008 - 如果您发现此答案有帮助,请考虑支持和/或接受它。接受的答案改进了 *** 作为未来寻求者的资源。

以上是关于如何在 plsql 的 varchar2 字段中的 xml 节点末尾插入“1”?的主要内容,如果未能解决你的问题,请参考以下文章

一个带有 CLOB 或 VARCHAR2 输入和 CLOB 或 VARCHAR2 返回值的单个 PLSQL 函数

如何将oracle表中的字段由integer 转变为varchar2(50)

Oracle SQL Developer 中的 Varchar2 变量

plsql一个函数的例子

oracle中怎样修改varchar2字段为clob字段

Oracle的CLOB大数据字段类型(转)