Как передать внешнюю функцию как переменную в xpath в OracleTable - PullRequest
0 голосов
/ 14 октября 2018

У меня есть XML-файл, подобный следующему:

     <GroupList>
       <Group>           
        <Title>
          <Name>Computer</Name>
        <Title>
        <Type>
          <Name>Book</Name>
        </Type>                   
        <DataList>
          <DataElement>
            <Name>Comment</Name>
            <Type>text</Type>
            <Value>ABC</Value>
            <Ordinality>1</Ordinality>
          </DataElement>
          <DataElement>
            <Name>Location</Name>
            <Type>set</Type>
            <Value>123</Value>
            <Ordinality>1</Ordinality>
          </DataElement>
        </DataList>
       </Group>
     </GroupList>

Я пытаюсь передать внешнюю функцию в качестве переменной в xpath, мне нужно получить значения DataElment / Name = 'Location'.

вот фрагмент запроса:

   SELECT *                   
            FROM wd,                                            
                XMLTABLE (                        
         'GroupList/Group[Title/Name=''Computer'']' 
          PASSING xmltype(wd.data), externalfunction as "i"
          COLUMNS 
                name VARCHAR2(200) PATH 'Title/Name'
               ,type VARCHAR2(200) PATH 'Type/Name'
               ,location VARCHAr2(200) PATH 'DataElementList/dataElement[$i]/Name'
               ,location_value VARCHAR2(200) PATH 'DataElementList/dataElement[$i]/Value'
              ) x 

внешняя функция возвращает число, когда я запускаю запрос, я получаю эту ошибку:

    ORA-19112: error raised during evaluation: XVM-01008: [XPST0008] Invalid reference
    1   DataElementList/dataElement[$i]/Value

что такоеправильный способ передачи переменной i в xpath?Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

@ Тина не уверена, как достичь в одном запросе, но я сделал через цикл с одной таблицей.Ниже приведены коды, которые можно сделать с помощью процедур ... Я просто хочу поделиться, может ли это быть полезным

create table  DataElement with fields  Name,  Type,value and   Ordinality

PROCEDURE GET_DataElement(
    in_xml_frag      IN     CLOB,
    in_table_name    IN     VARCHAR2,
    out_xml_rec     OUT    DataElement%ROWTYPE)
IS
    v_xml_rec DataElement%ROWTYPE;
    v_row_value    VARCHAR2(100);
    v_row_division CLOB ;
    v_xml SYS.XMLTYPE := XMLTYPE(in_xml_frag);

    CURSOR table_fields_rec
    IS
      SELECT column_name,
        data_length column_size,
        data_type,
        table_name
      FROM all_tab_columns
      WHERE TABLE_NAME = in_table_name
      ORDER BY column_id ASC;

BEGIN

    FOR rec IN table_fields_rec
    LOOP

        IF (v_xml.existsNode('/' || rec.table_name || '/' || rec.column_name || '/text()') = 1) THEN
            v_row_value := v_xml.EXTRACT('/' || rec.table_name || '/' || rec.column_name ||'/text()') .GETSTRINGVAL();

            v_row_value := COMMON_TOOLS.ELIMINATE_SPECIAL_CHRCTRS(v_row_value);
            CASE rec.column_name
            WHEN 'Name' THEN
                v_xml_rec.Name := v_row_value;
            WHEN 'Type' THEN
                v_xml_rec.Type := v_row_value;
            WHEN 'value' THEN
                v_xml_rec.value := v_row_value;
            WHEN 'Ordinality' THEN
                v_xml_rec.Ordinality := v_row_value;
            ELSE
               NULL;
            END CASE;
        ELSE
            NULL;
        END IF;
    END LOOP;
    out_xml_rec := v_xml_rec;
END GET_DataElement;
0 голосов
/ 15 октября 2018

спасибо за помощь.Я нашел альтернативу, не используя индекс для данных.Если кому-то интересно, вот рабочий запрос.

SELECT x.*, y.*                  
           FROM wd,                                            
           XMLTABLE (                        
         'GroupList/Group[Title/Name=''Computer'']' 
          PASSING xmltype(wd.data)
          COLUMNS 
                name VARCHAR2(200) PATH 'Title/Name'
               ,type VARCHAR2(200) PATH 'Type/Name'
               ,datalist xmltype   PATH 'DataList'
        ) x
        , XMLTABLE (
           '/DataList/DataElement'
           PASSING x.datalist
           COLUMNS
             location       VARCHAr2(200) PATH 'Name'
             location_value VARCHAR2(200) PATH 'Value'
        ) y
        where y.location ='Location'
        and other conditions
0 голосов
/ 15 октября 2018

Ниже приведен запрос для получения значения для одного элемента данных, у меня есть проблемы во внешней функции с параметром i для множественного набора ... Ошибка, я вижу, вам следует использовать DataList / DataElement вместо DataElementList / dataElement [$ i] / Value

with mytable as (select xmltype('
           <GroupList>
       <Group>           
        <Title>
          <Name>Computer</Name>
        </Title>
        <Type>
          <Name>Book</Name>
        </Type>                   
        <DataList>
          <DataElement>
            <Name>Comment</Name>
            <Type>text</Type>
            <Value>ABC</Value>
            <Ordinality>1</Ordinality>
          </DataElement>
        </DataList>
       </Group>
     </GroupList>') as xmlcol from dual)


  SELECT *                   
            FROM mytable,                                            
                XMLTABLE (                        
         'GroupList/Group[Title/Name=''Computer'']' 
          PASSING xmlcol
          COLUMNS 
                name VARCHAR2(200) PATH 'Title/Name'
               ,type VARCHAR2(200) PATH 'Type/Name'
               ,location VARCHAr2(200) PATH 'DataList/DataElement/Name'
               ,location_value VARCHAR2(200) PATH 'DataList/DataElement/Value'
              ) x
...