Oracle函数从XMLTABLE中提取数据
我正在尝试在Oracle中编写一个函数,该函数允许我指定标记名并返回一个特定值。因此,如果下面的代码段是我的XML的一部分,我想发送我想要的路径、序列号和特定字段,并获取返回的值Oracle函数从XMLTABLE中提取数据,xml,oracle,xmltable,Xml,Oracle,Xmltable,我正在尝试在Oracle中编写一个函数,该函数允许我指定标记名并返回一个特定值。因此,如果下面的代码段是我的XML的一部分,我想发送我想要的路径、序列号和特定字段,并获取返回的值 <variables> <variablesList> <sequence>1</sequence> <variableType>C1SQ</variableType> <missingValueAction>C
<variables>
<variablesList>
<sequence>1</sequence>
<variableType>C1SQ</variableType>
<missingValueAction>C1ER</missingValueAction>
<defaultValue>0</defaultValue>
<uom>KWB</uom>
<tou>SUMMER</tou>
<serviceQuantityToUse>C1BI</serviceQuantityToUse>
<targetCalcLines/>
</variablesList>
<variablesList>
<sequence>2</sequence>
<variableType>C1SQ</variableType>
<missingValueAction>C1ER</missingValueAction>
<defaultValue>0</defaultValue>
<uom>KWB</uom>
<tou>WINTER</tou>
<serviceQuantityToUse>C1BI</serviceQuantityToUse>
<targetCalcLines/>
</variablesList>
我这样调用函数:
select BO_DATA_AREA
, cm_get_bo_data_TableValue ('/root/variables/variablesList', 'tou', '2', BO_DATA_AREA)
from CM_CI1558A_BO_DATA_AUDIT
但是,它只适用于“tou”,因为我似乎无法在路径中添加变量
因此,如果我有以下内容,它将返回一个值:
select TagValue into v_value
from dual, XMLTable(pTableTag PASSING XMLTYPE( to_clob('<root>') || pBODataValue || '</root>' )
COLUMNS sequence_num VARCHAR2(10) PATH 'sequence',
TagValue VARCHAR2(10) PATH 'tou'
) t
where sequence_num = pSequence;
return v_value;
我希望能够指定每个特定的标记并返回值;我需要一次一个地处理它们,并且需要一些通用的东西,它将适用于比这个特定XML结构更广泛的领域
换言之,我希望能够为tou指定序列1并获得'SUMMER',为uom指定序列2并获得'KWB',为完全不同的标记和结构指定序列1并获得该值-对于我们可能遇到的任何表值(有一些)。您甚至不需要为此创建特殊函数,因为Oracle有很好的xmlquery功能。例如,如果希望通过xquery从xmltype中获取一些值: xmlcast( xmlquery(
“/root/variables/variablesList[2]/tou”-是的,我发现它不是有效的xml,并且没有父标记。没问题,您可以像示例中那样包装它,并使用我的answerIs Oracle 11g旧版本中的xmlquery函数?我在ORA-32512中得到的最接近的结果是:类型“xquery外部变量”是未知替代值(&)我将把路径和标记放在一个表中,需要组装我要查找的内容并返回值。我仍在尝试让xmlquery工作,但也有很多。谢谢!我终于解决了我的问题。当转换为使用实际的xml时,当我使用“传递xmltype(xmldata)”时它阻塞了,因为它不需要强制转换为xmltype。只使用xmldata是合适的。
select TagValue into v_value
from dual, XMLTable(pTableTag PASSING XMLTYPE( to_clob('<root>') || pBODataValue || '</root>' )
COLUMNS sequence_num VARCHAR2(10) PATH 'sequence',
TagValue VARCHAR2(10) PATH 'tou'
) t
where sequence_num = pSequence;
return v_value;
TagValue VARCHAR2(10) PATH pFieldTag
with test_table(xmldata) as (
select
q'[
<variables>
<variablesList>
<sequence>1</sequence>
<variableType>C1SQ</variableType>
<missingValueAction>C1ER</missingValueAction>
<defaultValue>0</defaultValue>
<uom>KWB</uom>
<tou>SUMMER</tou>
<serviceQuantityToUse>C1BI</serviceQuantityToUse>
<targetCalcLines/>
</variablesList>
<variablesList>
<sequence>2</sequence>
<variableType>C1SQ</variableType>
<missingValueAction>C1ER</missingValueAction>
<defaultValue>0</defaultValue>
<uom>KWB</uom>
<tou>WINTER</tou>
<serviceQuantityToUse>C1BI</serviceQuantityToUse>
<targetCalcLines/>
</variablesList>
</variables>
]'
from dual
)
select
xmlcast(
xmlquery(
'&input_path[&input_sequence]/&input_tag/text()'
passing xmltype(xmldata)
returning content
)
as varchar2(100)
) res
from test_table
/
input_path: /variables/variablesList
input_sequence: 2
input_tag: tou