По сравнению с Transact-SQL в PostgreSQL фунции на встроенном языке 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;
Вы можете просто выделить полученные строки в PgAdmin3 и сохранить их вручную в файл, а можете склеить их вот таким простейшим кодом на MONO:
После склеивания вы получите вот примерно вот такой XML (для двух строк с данными).