ASP NET, NET Framework, MONO, SQL, Visual Studio | Professional Programs | Программист Еремин В.В.
(SQL) SQL (2010 год)

Экспорт данных из PostgeSQL в XML

В отличии от MS SQL, СУБД PostgreSQL построена так, что собственно язык запроса между тегами $BODY$ может быть любой - его надо только указать после тега LANGUAGE (и не забыть проинсталлировать). Встроенными языками является собственно SQL и некий клон языка Oracle - PL/pgSQL. Жаль только в перечне поддерживаемых ПГ языков нет бейсика - C, C++, PL/Java, PL/R, PL/Lua, PL/LOLCODE, PL/Perl, pl/PHP, PL/Python, PL/Ruby, PL/sh, PL/Tc, PL/Scheme.


   1:  CREATE OR REPLACE FUNCTION "isnull"(text, text)
   2:    RETURNS text AS
   3:  $BODY$
   4:  SELECT 
   5:  (
   6:  CASE (SELECT $1 is null) 
   7:  WHEN true THEN $2 
   8:  ELSE $1 
   9:  END
  10:  ) AS RESULT
  11:  $BODY$
  12:    LANGUAGE 'sql' VOLATILE
  13:    COST 100;

Встроенный SQL-язык PostgreSQL обладает приятным, логически понятным синтаксисом и необычными возможностями - которые поражают воображение SQL-программистов c кругозором, ограниченным микрософтовской платформой. Например все столбцы таблицы можно вернуть как единственный столбец даже не выходя за рамки языка SQL:



По сравнению с Transact-SQL в PostgreSQL фунции на встроенном языке SQL не только могут принимать удивительные аргументы, такие как массивы и перечисления - но и могут возвращать различные аргументы, такие как таблицы в целом, ракордеты и выходные параметры.

Подходы к проектированию в таких продвинутых СУБД могут существенно отличаться от построения СУБД на более убогой платформе, например из-за невероятной легкости разворота столбцов в строки - Выполняем разворот строк в столбцы в MS SQL и PostgreSQL.


Но в этом топике я покажу как на PostgreSQL выполнить только одну, зато самую распространенную операцию - экспорт базы данных в формате XML. Это примерно такая же операция, как я описал в топике Этюды на ASP2. Делаем RSS-канал на одной SQL-процедуре для MS SQL, только здесь я опишу эту операцию для PostgreSQL:


   1:  CREATE OR REPLACE FUNCTION "ExportZakaz"()
   2:    RETURNS SETOF character varying AS
   3:  $BODY$
   4:  select '<?xml version="1.0" encoding="UTF-8"?>' as body
   5:   
   6:  union all
   7:   
   8:  select '<terminal id="1">' as body
   9:   
  10:  union all
  11:   
  12:  select ' <disk i="' || i || '"' ||
  13:    ' tomodif="' || tomodif || '"' ||
  14:    ' МаркаАвто="' || "МаркаАвто" || '"' ||
  15:    ' Модель_Наименование="' || "Модель_Наименование" || '"' ||
  16:    ' Модификация_Наименование="' || "Модификация_Наименование" || '"' ||
  17:    ' ГодВыпуска="' || "ГодВыпуска" || '"' ||
  18:    ' ИмпортСкладскихОстатков_i="' || "ИмпортСкладскихОстатков_i" || '"' ||
  19:    ' ИмпортСкладскихОстатков_ДатаИмпо="' || "ИмпортСкладскихОстатков_ДатаИмпо" || '"' ||
  20:    ' СкладскиеОстаткиДисков_i="' || "СкладскиеОстаткиДисков_i" || '"' ||
  21:    ' ВыбранныйДиск_ПосадочныйДиаметр="' || "ВыбранныйДиск_ПосадочныйДиаметр" || '"' ||
  22:    ' ВыбранныйДиск_Ширина="' || "ВыбранныйДиск_Ширина" || '"' ||
  23:    ' ВыбранныйДиск_Вылет_ET="' || "ВыбранныйДиск_Вылет_ET" || '"' ||
  24:    ' ВыбранныйДиск_Сверловка_Hole="' || "ВыбранныйДиск_Сверловка_Hole" || '"' ||
  25:    ' ВыбранныйДиск_Сверловка_PCD="' || "ВыбранныйДиск_Сверловка_PCD" || '"' ||
  26:    ' ВыбранныйДиск_ЦентральноеОтверст="' || "ВыбранныйДиск_ЦентральноеОтверст" || '"' ||
  27:    ' ВыбранныйДиск_Цвет="' || "ВыбранныйДиск_Цвет" || '"' ||
  28:    ' ВыбранныйДиск_Атрикул="' || "ВыбранныйДиск_Атрикул" || '"' ||
  29:    ' ВыбранныйДиск_Наименование="' || "ВыбранныйДиск_Наименование" || '"' ||
  30:    ' ВыбранныйДиск_Kol="' || "ВыбранныйДиск_Kol" || '"' ||
  31:    ' ВыбранныйДиск_Цена="' || "ВыбранныйДиск_Цена" || '"' ||
  32:    ' Заказ_Количество="' || "Заказ_Количество" || '"' ||
  33:    ' Заказчик_Tel="' || "Заказчик_Tel" || '"' ||
  34:    ' Заказчик_АдресДоставки="' || "Заказчик_АдресДоставки" || '"' ||
  35:    ' Заказчик_ФИО="' || "Заказчик_ФИО" || '"' ||
  36:    ' ДатаЗаказа="' || "ДатаЗаказа" || '"' ||
  37:    ' />' as body
  38:  from "ЗаказыДисков" 
  39:   
  40:  union all
  41:   
  42:  select ' <shina i="' || i || '"' ||
  43:    ' tomodif="' || tomodif || '"' ||
  44:    ' МаркаАвто="' || "МаркаАвто" || '"' ||
  45:    ' Модель_Наименование="' || "Модель_Наименование" || '"' ||
  46:    ' Модификация_Наименование="' || "Модификация_Наименование" || '"' ||
  47:    ' ГодВыпуска="' || "ГодВыпуска" || '"' ||
  48:    ' ВыбраннаяШина_Высота="' ||  "ВыбраннаяШина_Высота"  || '"' ||
  49:    ' ВыбраннаяШина_ПосадочныйДиаметр="' ||  "ВыбраннаяШина_ПосадочныйДиаметр"  || '"' ||
  50:    ' ВыбранныйШина_Ширина="' ||  "ВыбранныйШина_Ширина"  || '"' ||
  51:    ' ИмпортСкладскихОстатков_i="' ||  "ИмпортСкладскихОстатков_i" || '"' ||
  52:    ' ИмпортСкладскихОстатков_ДатаИмпо="' ||  "ИмпортСкладскихОстатков_ДатаИмпо" || '"' ||
  53:    ' СкладскиеОстаткиШин_i="' ||  "СкладскиеОстаткиШин_i" || '"' ||
  54:    ' СкладскиеОстаткиШин_Атрикул="' ||  "СкладскиеОстаткиШин_Атрикул" || '"' ||
  55:    ' СкладскиеОстаткиШин_Наименование="' ||  "СкладскиеОстаткиШин_Наименование" || '"' ||
  56:    ' СкладскиеОстаткиШин_Kol="' ||  "СкладскиеОстаткиШин_Kol" || '"' ||
  57:    ' СкладскиеОстаткиШин_Цена="' ||  "СкладскиеОстаткиШин_Цена" || '"' ||
  58:    ' СкладскиеОстаткиШин_ЦенаТекст="' ||  "СкладскиеОстаткиШин_ЦенаТекст" || '"' ||
  59:    ' СвойстаТовара_ВысотаШины="' ||  "СвойстаТовара_ВысотаШины" || '"' ||
  60:    ' СвойстаТовара_ДиаметрШины="' ||  "СвойстаТовара_ДиаметрШины" || '"' ||
  61:    ' СвойстаТовара_РазмерШины="' ||  "СвойстаТовара_РазмерШины" || '"' ||
  62:    ' СвойстаТовара_ШиринаШины="' ||  "СвойстаТовара_ШиринаШины" || '"' ||
  63:    ' СвойстаТовара_ИндексНагрузкиШины="' ||  "СвойстаТовара_ИндексНагрузкиШины" || '"' ||
  64:    ' СвойстаТовара_ИндексСкоростиШины="' ||  "СвойстаТовара_ИндексСкоростиШины" || '"' ||
  65:    ' СвойстаТовара_СезонностьШины="' ||  "СвойстаТовара_СезонностьШины" || '"' ||
  66:    ' СвойстаТовара_ТипШины="' ||  "СвойстаТовара_ТипШины" || '"' ||
  67:    ' СвойстаТовара_ШинаПовышеннойПроходимости="' ||  "СвойстаТовара_ШинаПовышеннойПроходимости" || '"' ||
  68:    ' СвойстаТовара_ШинаУсиленная="' ||  "СвойстаТовара_ШинаУсиленная" || '"' ||
  69:    ' СвойстаТовара_ШинаШипованная="' ||  "СвойстаТовара_ШинаШипованная" || '"' ||
  70:    ' Заказ_Количество="' || "Заказ_Количество" || '"' ||
  71:    ' Заказчик_Tel="' || "Заказчик_Tel" || '"' ||
  72:    ' Заказчик_АдресДоставки="' || "Заказчик_АдресДоставки" || '"' ||
  73:    ' Заказчик_ФИО="' || "Заказчик_ФИО" || '"' ||
  74:    ' ДатаЗаказа="' || "ДатаЗаказа" || '"' ||
  75:    ' />' as body
  76:  from "ЗаказыШин" 
  77:   
  78:  union all
  79:  select '</terminal>' as body;
  80:  $BODY$
  81:    LANGUAGE 'sql' VOLATILE
  82:    COST 100
  83:    ROWS 1000;
  84:  ALTER FUNCTION "ExportZakaz"() OWNER TO postgres;

Здесь RETURNS SETOF - означает рекордсет в качестве возвращаемых параметров. Вызов такой процедуры выглядит вот так:




Вы можете просто выделить полученные строки в PgAdmin3 и сохранить их вручную в файл, а можете склеить их вот таким простейшим кодом на MONO:


   1:      Public Sub GetZakaz()
   2:          _CMD_XML_export = "select * from ""ExportZakaz""();"
   3:          Dim RDR As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_XML_export)
   4:          Dim X As New System.Text.StringBuilder
   5:          While RDR.Read
   6:              If Not IsDBNull(RDR("ExportZakaz")) Then
   7:                  X.AppendLine(RDR("ExportZakaz"))
   8:              End If
   9:          End While
  10:          _XML_export = X.ToString
  11:      End Sub

После склеивания вы получите вот примерно вот такой XML (для двух строк с данными).




http://mono-net.ru/


Комментарии к этой страничке ( )
ссылка на эту страничку: http://www.vb-net.ru/PostgreSQL/xml.htm
<На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>