PL / SQL Сравнить XMLTypes - PullRequest
       1

PL / SQL Сравнить XMLTypes

1 голос
/ 21 февраля 2020

У меня есть таблица SQL, которую я использую как очередь, с одним из столбцов как XMLType. Что я пытаюсь сделать с таблицей, так это создать программу для извлечения определенной части данных c, итерации по таблице, чтения информации и удаления строки после того, как я закончу. Я не могу просто стереть всю таблицу после того, как я закончу, потому что не все данные должны быть удалены.

Мое текущее решение:

   FOR xml_data FROM (SELECT xml_column from table_a) 
   LOOP
   -- Process the data
   ...

   --- Delete the row
   DELETE FROM table_a where xml_column = xml_data.xml_column;
   END LOOP;

Однако я сталкиваюсь с проблема с частью удаления, которая выдает ошибку:

  Error report -
  ORA-22950: cannot ORDER objects with MAP or ORDER method
  ...
  Action: Define a MAP or ORDER method for the object type

Кто-нибудь знает, что решение для этого? Я также открыт для других решений, чтобы удалить строку после итерации по ней.

РЕДАКТИРОВАТЬ: Исправить код

1 Ответ

2 голосов
/ 22 февраля 2020

Большие или сложные объекты нельзя сравнивать тривиально со знаком равенства. Oracle пытается спасти вас здесь, потому что сравнение огромных объектов может вызвать проблемы с производительностью, и существуют различные способы сравнения XML. Сообщение об ошибке ORA-22950 говорит о том, что вы могли бы сравнить объекты, если построили специфическую c функцию сравнения.

Но в этом случае нет необходимости напрямую сравнивать XML. Если вы просматриваете строки в таблице, гораздо быстрее определить строки по ROWID, который является физическим указателем на местоположение строки.

begin
    for xml_data in (select rowid, xml_column from table_a)
    loop
        -- Process the data
        -- ...

        delete from table_a where rowid = xml_data.rowid;
    end loop;
end;
/
...