Поиск повторяющихся подстрок в строке - PullRequest
0 голосов
/ 29 октября 2019

Я новичок в PL / SQL, и мне дали эту задачу. У меня есть XML-сообщения, которые хранятся в таблице Receive_XML с именем поля XML_DATA. Были проблемы, когда отправляющее местоположение отправляет разделенные последовательности, что вызывает их проблемы при получении обратно. Разделенная последовательность - это место, где мы получаем последовательность № 1, затем последовательность № 2, а затем снова последовательность № 1.

Каков наилучший способ поиска в таблице Receive_XML для поиска случаев, когда любая последовательность повторяетсяболее одного раза, не зная порядковый номер. Вот пример XML-записи, которую мы получаем.

<MESSAGE>
	<HEADER>
		<MESSAGE_TYPE>ProductionSequence</MESSAGE_TYPE>
		<TIMESTAMP>2019-10-29 10:00:01</TIMESTAMP>
	</HEADER>
	<PRODUCTION_SEQUENCE>
		<SEQUENCES>
			<SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="">
				<PIECE_GROUPS>
					<PIECE_GROUP>
						<PIECE>
							<PIECE_ID>514236947</PIECE_ID>
						</PIECE>
						<PIECE>
							<PIECE_ID>578645897</PIECE_ID>
						</PIECE>
					</PIECE_GROUP>
				</PIECE_GROUPS>
			</SEQUENCE>
			<SEQUENCE SEQUENCE_ID="6452          " SEQUENCE_ID_PARENT="8764">
				<PIECE_GROUPS>
					<PIECE_GROUP>
						<PIECE>
							<PIECE_ID>514236947</PIECE_ID>
						</PIECE>
						<PIECE>
							<PIECE_ID>578645897</PIECE_ID>
						</PIECE>
					</PIECE_GROUP>
				</PIECE_GROUPS>
			</SEQUENCE>
			<SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="6452">
				<PIECE_GROUPS>
					<PIECE_GROUP>
						<PIECE>
							<PIECE_ID>514236947</PIECE_ID>
						</PIECE>
						<PIECE>
							<PIECE_ID>578645897</PIECE_ID>
						</PIECE>
					</PIECE_GROUP>
				</PIECE_GROUPS>
			</SEQUENCE>
		</SEQUENCES>
	</PRODUCTION_SEQUENCE>
</MESSAGE>

Спасибо за любую помощь, которую вы можете предоставить.

Билл


То, что я наконец нашел, сработало для меня:

select SEQUENCE_ID, count(SEQUENCE_ID) Counter
from (
  select SEQUENCE_ID
  from   Receive_XML tbl,
       xmltable('/MESSAGE/PRODUCTION_SEQUENCE/SEQUENCES/SEQUENCE' 
                PASSING xmltype(tbl.xml_data)
                COLUMNS SEQUENCE_ID VARCHAR2(30) PATH '@SEQUENCE_ID')
  where tbl.id = 4451
) rs
group by SEQUENCE_ID;

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Пожалуйста, попробуйте следующее PL / SQL . Он считается атрибутом @SEQUENCE_ID. Значение больше 1 означает, что это дубликат.

PL / SQL

CREATE TABLE tbl (ID INT, xml_data XMLType);
INSERT INTO tbl (ID, xml_data)
VALUES
(1, '<MESSAGE>
    <HEADER>
        <MESSAGE_TYPE>ProductionSequence</MESSAGE_TYPE>
        <TIMESTAMP>2019-10-29 10:00:01</TIMESTAMP>
    </HEADER>
    <PRODUCTION_SEQUENCE>
        <SEQUENCES>
            <SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="">
                <PIECE_GROUPS>
                    <PIECE_GROUP>
                        <PIECE>
                            <PIECE_ID>514236947</PIECE_ID>
                        </PIECE>
                        <PIECE>
                            <PIECE_ID>578645897</PIECE_ID>
                        </PIECE>
                    </PIECE_GROUP>
                </PIECE_GROUPS>
            </SEQUENCE>
            <SEQUENCE SEQUENCE_ID="6452          " SEQUENCE_ID_PARENT="8764">
                <PIECE_GROUPS>
                    <PIECE_GROUP>
                        <PIECE>
                            <PIECE_ID>514236947</PIECE_ID>
                        </PIECE>
                        <PIECE>
                            <PIECE_ID>578645897</PIECE_ID>
                        </PIECE>
                    </PIECE_GROUP>
                </PIECE_GROUPS>
            </SEQUENCE>
            <SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="6452">
                <PIECE_GROUPS>
                    <PIECE_GROUP>
                        <PIECE>
                            <PIECE_ID>514236947</PIECE_ID>
                        </PIECE>
                        <PIECE>
                            <PIECE_ID>578645897</PIECE_ID>
                        </PIECE>
                    </PIECE_GROUP>
                </PIECE_GROUPS>
            </SEQUENCE>
        </SEQUENCES>
    </PRODUCTION_SEQUENCE>
</MESSAGE>');

select ID, SEQUENCE_ID, count(SEQUENCE_ID) Counter
from (
  select ID, SEQUENCE_ID
  from   tbl,
       xmltable('/MESSAGE/PRODUCTION_SEQUENCE/SEQUENCES/SEQUENCE' 
                PASSING tbl.xml_data 
                COLUMNS SEQUENCE_ID VARCHAR2(30) PATH '@SEQUENCE_ID')
) rs
group by ID, SEQUENCE_ID;

Вывод

+----+-------------+---------+
| ID | SEQUENCE_ID | Counter |
+----+-------------+---------+
|  1 |        6452 |       1 |
|  1 |        8764 |       2 |
+----+-------------+---------+
1 голос
/ 29 октября 2019

Этот пример xpath работает:

with Receive_XML as (
select xmltype('
<MESSAGE>
     <HEADER>
<MESSAGE_TYPE>ProductionSequence</MESSAGE_TYPE>
         <TIMESTAMP>2019-10-29 10:00:01</TIMESTAMP>
     </HEADER>
     <PRODUCTION_SEQUENCE>
         <SEQUENCES>
             <SEQUENCE SEQUENCE_ID="8764          " SEQUENCE_ID_PARENT="">
                 <PIECE_GROUPS>
                     <PIECE_GROUP>
                         <PIECE>
<PIECE_ID>514236947</PIECE_ID>
                         </PIECE>
                         <PIECE>
<PIECE_ID>578645897</PIECE_ID>
                         </PIECE>
                     </PIECE_GROUP>
                 </PIECE_GROUPS>
             </SEQUENCE>
             <SEQUENCE SEQUENCE_ID="6452          " 
SEQUENCE_ID_PARENT="8764">
                 <PIECE_GROUPS>
                     <PIECE_GROUP>
                         <PIECE>
<PIECE_ID>514236947</PIECE_ID>
                         </PIECE>
                         <PIECE>
<PIECE_ID>578645897</PIECE_ID>
                         </PIECE>
                     </PIECE_GROUP>
                 </PIECE_GROUPS>
             </SEQUENCE>
             <SEQUENCE SEQUENCE_ID="8764          " 
SEQUENCE_ID_PARENT="6452">
                 <PIECE_GROUPS>
                     <PIECE_GROUP>
                         <PIECE>
<PIECE_ID>514236947</PIECE_ID>
                         </PIECE>
                         <PIECE>
<PIECE_ID>578645897</PIECE_ID>
                         </PIECE>
                     </PIECE_GROUP>
                 </PIECE_GROUPS>
             </SEQUENCE>
         <SEQUENCE SEQUENCE_ID="6452          " SEQUENCE_ID_PARENT="8764">
                 <PIECE_GROUPS>
                     <PIECE_GROUP>
                         <PIECE>
<PIECE_ID>514236947</PIECE_ID>
                         </PIECE>
                         <PIECE>
<PIECE_ID>578645897</PIECE_ID>
                         </PIECE>
                     </PIECE_GROUP>
                 </PIECE_GROUPS>
             </SEQUENCE>
         </SEQUENCES>
     </PRODUCTION_SEQUENCE>
</MESSAGE>
')  XML_DATA from dual )
select
xt.dup
FROM   Receive_XML xt,
       XMLTABLE('//SEQUENCE'
         PASSING xt.xml_data
         COLUMNS 
          dup VARCHAR2(20)  PATH '@SEQUENCE_ID[.= ../preceding-sibling::SEQUENCE/@SEQUENCE_ID]'
        ) xt
where dup is not null        
...