Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle函数从XMLTABLE中提取数据_Xml_Oracle_Xmltable - Fatal编程技术网

Oracle函数从XMLTABLE中提取数据

Oracle函数从XMLTABLE中提取数据,xml,oracle,xmltable,Xml,Oracle,Xmltable,我正在尝试在Oracle中编写一个函数,该函数允许我指定标记名并返回一个特定值。因此,如果下面的代码段是我的XML的一部分,我想发送我想要的路径、序列号和特定字段,并获取返回的值 <variables> <variablesList> <sequence>1</sequence> <variableType>C1SQ</variableType> <missingValueAction>C

我正在尝试在Oracle中编写一个函数,该函数允许我指定标记名并返回一个特定值。因此,如果下面的代码段是我的XML的一部分,我想发送我想要的路径、序列号和特定字段,并获取返回的值

<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