Мельница данных  (01.05.2024)
Сборка xml-документа на сервере

Механизм создает большую нагрузку на сервер БД, но в то же время позволяет существенно ускорить перекачку данных.

Firebird
Чтобы использовать формирование xml-документов на сервере, необходимо, чтобы одновременно выполнялись следующие условия:
  • Таблица не содержит полей типа BLOB.
  • Таблица не содержит строковых полей, которые могут содержать не-xml-compaint символы (определяется по свойствам соответствующего строкового домена.
В этом случае будут формироваться и выполняться запросы вида
1with T as (select T.* from "...." T order by T."ID")
2select cast(cast(
3  '<data handle="' || count(1) ||  '" eof="1">' || list('<row>' ||
4    '<ID type="int64">' || T."ID" || '</ID>' ||
5      case when T."..." is null then '<.../>' else '<... type="int">' || T."..." || '</...>' end ||
6      ......
7    || '</row>' , '') || '</data>' as blob sub_type 1 character set utf8) as blob sub_type 0), count(1)
8  from T
    
При выполнении такого запроса клиент получит blob, содержащий требуемый xml-документ в требуемой кодировке.

Oracle
Чтобы использовать формирование xml-документов на сервере, необходимо, чтобы одновременно выполнялись следующие условия:
  • Используется Oracle версии не ниже 11.
  • Таблица не содержит полей типа BLOB.
В этом случае будут формироваться и выполняться запросы вида
1with T as (select T.* from "..." T )
2select "SYS$HELPER"."ClobToBlob"('<data handle="' || count(1) || '" eof="1">' ||
3  xmlagg(xmlelement("row", xmlelement("ID", xmlattributes('int64' as "type"), T."ID"),
4    case when "..." is null then xmltype('<..../>') else
5      xmlelement("....", xmlattributes('ascii' as "type"), "SYS$HELPER"."XMLEscape"(asciistr(T."...."), 0)) end,
6    ....
7 order by T."ID").getclobval() || '</data>'), count(1) from T
    
При выполнении такого запроса клиент получит blob, содержащий требуемый xml-документ в требуемой кодировке.

Postgres
Чтобы использовать формирование xml-документов на сервере, необходимо, чтобы одновременно выполнялись следующее условие:
  • Таблица не содержит полей типа BLOB.
В этом случае будут формироваться и выполняться запросы вида
1select convert_to( '<data handle="' || count(1) ||  '" eof="1">' || string_agg(
2  '<row>' ||
3    '<ID type="int64">' || T."ID" || '</ID>' ||
4    case when T."...." is null then '<..../>' else '<.... type="int64">' || T."...." || '</....>' end ||
5    .....
6  '</row>', '' order by T."ID") || '</data>', 'UTF8'), count(1) from "..." T
    
При выполнении такого запроса клиент получит blob, содержащий требуемый xml-документ в требуемой кодировке.

Механизм может быть принудительно заблокирован ключем /NOXML.