Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Столкнулся с проблемой, надо выгрузить результаты запроса в файл в формате XML. Смущает что пакетов несколько, про количество функций молчу, опыта подобных выгрузок 0,00%, не очень понятно где копать. Был бы благодарен если направите на путь истинный как это сделать проще и посовременние. Oracle 12, имеются на руках примеры файлов XML которые должны получиться, а также схема файла для выгрузки в формате XSD.

Есть ли возможность чтобы при запросе указать такой вот XSD (ну выдрав предварительно его структуру и исполоьзвать его содержимое как входной параметр, запрос еще одним параметром) на выходе получить такой вот правильный XML. Если кинете ссылку на пример буду благодарен особенно

Заранее спасибо


P.S.Доброго дня и с наступившим НГ :)
1 янв 19, 11:05    [21777304]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
RTFM XML DB Developer Guide
1 янв 19, 13:46    [21777332]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Elic,

а немножко более развернуто можно, в какой части по Вашему мнению искать ответы ?
1 янв 19, 15:56    [21777349]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
createSchemaBasedXML

SY.
1 янв 19, 16:48    [21777360]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Из того что прочел , у меня создалось впечатление что XSD будет использован только для проверки - по формату/не по формату сгенерированный файл, но для механизма собственно генерации это не поможет . Это так ?

У меня файл XML будет несколько уровней, то есть если я правильно понял по доыольно скудным примерам для DBMS_XMLGEN надо будет соответствующие типы создать..

Все-таки хотелось бы ясности, смотреть в сторону DBMS_XMLGEN.getxml или все же можно XSD для ГЕНЕРАЦИИ облегчить реализации
1 янв 19, 17:49    [21777372]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Пример сгенерированного XML каким он должен быть
<Report xmlns="http://www.jaxb.msp/report/IncomeReport">
	<DateCreate>2018-12-11</DateCreate>
	<Dognum>809112</Dognum>
	<ReportType>1</ReportType>
	<BnfMonth>2018-09-01</BnfMonth>
	<Check1>0.00</Check1>
	<Check2>1012.99</Check2>
	<Check3>0.00</Check3>
	<Check4>0.00</Check4>
	<Beneficiaries>
		<Beneficiary>
			<MoID>809</MoID>
			<PayID>1157897065</PayID>
			<NUMLS>1230987</NUMLS>
			<SNILS>012-721-011 00</SNILS>
			<Name1>Иванов</Name1>
			<Name2>Иван</Name2>
			<Name3>Иванович</Name3>
			<StreetID>12670</StreetID>
			<HouseNum>12</HouseNum>
			<CorpusNum>3</CorpusNum>
			<BuildingNum>1</BuildingNum>
			<Flat>15</Flat>
			<UNOM>5432</UNOM>
			<HouseFIAS>123</HouseFIAS>
			<Phone>4990010101</Phone>
			<OccupType>2</OccupType>
			<OwnProperty>1</OwnProperty>
			<PPLReg>2</PPLReg>
			<PPLCnt>2</PPLCnt>
			<TotalSquare>56.7</TotalSquare>
			<Gender>М</Gender>
			<Birthday>1950-05-12</Birthday>
			<OwnSquare>28.7</OwnSquare>
			<RegType>1</RegType>
			<LivingType>1</LivingType>
			<DocType>21</DocType>
			<DocSeries>4509</DocSeries>
			<DocNumber>987608</DocNumber>
			<DocDate>2006-09-05</DocDate>
			<DocOrg>ОВД</DocOrg>
			<FamilyMembers>
				<FamilyMember>
					<SNILS>015-725-041 08</SNILS>
					<Name1>Иванова</Name1>
					<Name2>Анна</Name2>
					<Name3>Егоровна</Name3>
					<Gender>Ж</Gender>
					<Birthday>1952-07-01</Birthday>
					<FamilyRelation>2</FamilyRelation>
					<OwnSquare>28</OwnSquare>
				</FamilyMember>
			</FamilyMembers>
			<Categories>
				<Category>
					<BenefitID>67</BenefitID>
					<Documents>
						<Document>
							<DocType>12</DocType>
							<DocSeries>АБ</DocSeries>
							<DocNumber>123</DocNumber>
							<DocDate>2010-08-07</DocDate>
							<DocOrg>МУСЗН</DocOrg>
						</Document>
					</Documents>
				        <Services>
 				          	<Service>
				              		<ServiceID>182</ServiceID>
 				             		<Tariff>188.53</Tariff>
				              		<ConsumerQty>1</ConsumerQty>
				              		<Quant>1.9955</Quant>
 				             		<BnfSquare>38.6</BnfSquare>
 				             		<Summa>188.10</Summa>
 				             		<TotalQuant>1.9955</TotalQuant>
 				           	</Service>
 				         </Services>
				</Category>
				<Category>
					<BenefitID>84</BenefitID>
					<Documents>
						<Document>
							<DocType>15</DocType>
							<DocSeries>МСЭ-2015</DocSeries>
							<DocNumber>567</DocNumber>
							<DocDate>2015-12-07</DocDate>
							<DocEnd>2016-12-07</DocEnd>
							<DocOrg>ВТЭК</DocOrg>
						</Document>
					</Documents>
				        <Services>
 				          	<Service>
				              		<ServiceID>33</ServiceID>
 				             		<Tariff>2279.95</Tariff>
				              		<ConsumerQty>1</ConsumerQty>
				              		<Quant>0.474371</Quant>
 				             		<BnfSquare>38.6</BnfSquare>
 				             		<Summa>540.77</Summa>
 				             		<TotalQuant>0.474371</TotalQuant>
 				           	</Service>
 				         </Services>
				</Category>
			</Categories>
		</Beneficiary>
		<Beneficiary>
			<MoID>809</MoID>
			<PayID>1157897065</PayID>
			<NUMLS>1230988</NUMLS>
			<SNILS>012-751-011 00</SNILS>
			<Name1>Петрова</Name1>
			<Name2>Ольга</Name2>
			<Name3>Ивановна</Name3>
			<StreetID>12670</StreetID>
			<HouseNum>12</HouseNum>
			<CorpusNum>3</CorpusNum>
			<BuildingNum>1</BuildingNum>
			<Flat>14</Flat>
			<UNOM>5432</UNOM>
			<HouseFIAS>123</HouseFIAS>
			<Phone>4990010102</Phone>
			<OccupType>2</OccupType>
			<OwnProperty>1</OwnProperty>
			<PPLReg>2</PPLReg>
			<PPLCnt>2</PPLCnt>
			<TotalSquare>56.7</TotalSquare>
			<Gender>М</Gender>
			<Birthday>1955-05-12</Birthday>
			<OwnSquare>28.7</OwnSquare>
			<RegType>1</RegType>
			<LivingType>1</LivingType>
			<DocType>21</DocType>
			<DocSeries>4509</DocSeries>
			<DocNumber>987609</DocNumber>
			<DocDate>2008-09-05</DocDate>
			<DocOrg>ОВД</DocOrg>
			<FamilyMembers>
				<FamilyMember>
					<SNILS>015-735-045 08</SNILS>
					<Name1>Петров</Name1>
					<Name2>Иван</Name2>
					<Name3>Петрович</Name3>
					<Gender>М</Gender>
					<Birthday>1953-07-01</Birthday>
					<FamilyRelation>2</FamilyRelation>
					<OwnSquare>28</OwnSquare>
				</FamilyMember>
			</FamilyMembers>
			<Categories>
				<Category>
					<BenefitID>68</BenefitID>
					<Documents>
						<Document>
							<DocType>12</DocType>
							<DocSeries>АБ</DocSeries>
							<DocNumber>125</DocNumber>
							<DocDate>2011-08-07</DocDate>
							<DocOrg>МУСЗН</DocOrg>
						</Document>
					</Documents>
				        <Services>
 				          	<Service>
				              		<ServiceID>182</ServiceID>
 				             		<Tariff>188.53</Tariff>
				              		<ConsumerQty>1</ConsumerQty>
				              		<Quant>0.333333</Quant>
 				             		<BnfSquare>17.6</BnfSquare>
 				             		<Summa>31.42</Summa>
 				             		<TotalQuant>0.999999</TotalQuant>
 				           	</Service>
 				         </Services>
				</Category>
				<Category>
					<BenefitID>84</BenefitID>
					<Documents>
						<Document>
							<DocType>15</DocType>
							<DocSeries>МСЭ-2016</DocSeries>
							<DocNumber>568</DocNumber>
							<DocDate>2016-12-07</DocDate>
							<DocEnd>2017-12-07</DocEnd>
							<DocOrg>ВТЭК</DocOrg>
						</Document>
					</Documents>
				        <Services>
 				          	<Service>
				              		<ServiceID>33</ServiceID>
 				             		<Tariff>1806.89</Tariff>
				              		<ConsumerQty>1</ConsumerQty>
				              		<Quant>0.279708</Quant>
 				             		<BnfSquare>17.6</BnfSquare>
 				             		<Summa>252.70</Summa>
 				             		<TotalQuant>0.839124</TotalQuant>
 				           	</Service>
 				         </Services>
				</Category>
			</Categories>
		</Beneficiary>
	</Beneficiaries>
</Report>
1 янв 19, 18:00    [21777375]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
RTFM XML Functions (FAQ)
1 янв 19, 18:13    [21777382]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
Dual_Bios
Из того что прочел , у меня создалось впечатление что XSD будет использован только для проверки - по формату/не по формату сгенерированный файл, но для механизма собственно генерации это не поможет . Это так ?
Ты не безнадёжен. Чудо-генератор сможет сосать данные из вакуума?
2 янв 19, 07:43    [21777498]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Elic,

данные-то я буду запросом доставать, я просто надеялся, что есть некий движок в который можно прописать соответствие XSD поля с полем в результаете запроса и который сам "отформатирует" включая вложенности.
2 янв 19, 09:03    [21777503]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
Dual_Bios
я просто надеялся, что есть некий движок
Есть: 21777382
2 янв 19, 09:07    [21777504]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Elic
Dual_Bios
я просто надеялся, что есть некий движок
Есть: 21777382


Или я совсем туплю или мы говорим о разном. Изначально я предполагал что есть некая функция Х, где входные параметры А- текст запроса, B-текст шаблона XSD. Или XSD где-то зарегстрирован и B параметр ссылается на него). И функция по этому скелету вернет готовый XML

Вы даете мне ссылки , но эти функции как-то не укладываются у меня в какую-то единую конструкцию как бы это могло быть. Можете дать ссылку на ПРИМЕР что-то пусть очень отдаленного, но того что по Вашему мнению будет ориентиром КАК это надо сделать ? Чтобы какая-то общая картина нарисовалась в голове
2 янв 19, 09:24    [21777507]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
Dual_Bios
я предполагал что есть некая функция Х, где входные параметры А- текст запроса
Предположи более приземлённо: как мог бы выглядеть запрос
Dual_Bios
включая вложенности
2 янв 19, 09:29    [21777508]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34630
Dual_Bios,

Попробуй посмотреть на xsl трансформации
2 янв 19, 10:17    [21777520]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Elic,

для начала мне надо понять базово, какой пакет и функция будет задействована. Из того что я нашел, я так понял что есть две основные альтернативы, или
что то типа такого решения (ну понятно более насыщенного)
declare    
      
      l_directory    varchar2(30) := 'TMP_DIR';    
      l_filename     varchar2(256) := 'test.xml';    
      l_xml          xmltype;    
      l_schema_url   varchar2(256) := 'http://xmlns.oracle.com/xml/student_content.xsd';   
      
      l_xlist        xmlsequencetype := xmlsequencetype();  
      l_output       clob;    
      
      cursor c_xml is  
      select xmlelement("Description"      
             , xmlelement("Key", t.description)      
             ) as doc  
      from my_table t;     
      
    begin    
      
      for r in c_xml loop  
      
        l_xml := r.doc.createSchemaBasedXML(l_schema_url);  
        l_xml.schemaValidate();  
      
        l_xlist.extend;  
        l_xlist(l_xlist.last) := l_xml;  
      
      end loop;  
      
      -- aggregate all validated instances into a single XML fragment :   
      select xmlserialize(content xmlagg(t.column_value))  
      into l_output  
      from table(l_xlist) t;  
      
      dbms_xslprocessor.clob2file(    
        l_output
      , l_directory  
      , l_filename  
      , nls_charset_id('AL32UTF8')  
      );    
      
    end;    
        


Или через dbms_xmlgen.getxml

Пытаюсь понять по какой ветке пойти
2 янв 19, 10:38    [21777525]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Elic
Dual_Bios
я предполагал что есть некая функция Х, где входные параметры А- текст запроса
Предположи более приземлённо: как мог бы выглядеть запрос
Dual_Bios
включая вложенности

Ну или тупая плоская таблица , где левая часть тупо бы дублилась в рамках одного узла, если бы как-от можно было бы директинво указать что эти поля узлы, либо через cast(collect( c приведением к типам
2 янв 19, 10:46    [21777527]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
MasterZiv
Dual_Bios,

Попробуй посмотреть на xsl трансформации


Хм, посмотрел но пока вижу только взаимоотношения с готовый XML который у меня еще должен как-то получиться. А пока я еще для себя не понял каким способом его стоит получать
2 янв 19, 10:59    [21777530]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
Dual_Bios
А пока я еще для себя не понял каким способом его стоит получать
https://www.sql.ru/forum/actualsearch.aspx?search=xmlelement xmlagg&sin=0&bid=3&a=&ma=0&dt=-1&s=1&so=1
2 янв 19, 11:17    [21777534]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Dual_Bios
Хм, посмотрел но пока вижу только взаимоотношения с готовый XML который у меня еще должен как-то получиться. А пока я еще для себя не понял каким способом его стоит получать


Запрос имеешь, ну так добавь агрегацию и используй XMLELEMENT + XMLAGG + (по вкусу) XMLSERIALIZE . Например запрос:

SELECT  D.DEPTNO,
        D.DNAME,
        D.LOC,
        E.EMPNO,
        E.ENAME,
        E.JOB,
        E.SAL,
  FROM  DEPT D,
        EMP E
  WHERE E.DEPTNO = D.DEPTNO
/  


Добавляем агрегацию, XMLELEMENT, XMLAGG, XMLSERIALIZE:

SELECT  XMLSERIALIZE(
                     DOCUMENT
                     XMLELEMENT(
                                "ORGANIZATION",
                                XMLELEMENT(
                                           "DEPARTMENTS",
                                           XMLAGG(
                                                  XMLELEMENT(
                                                             "DEPARTMENT",
                                                             XMLELEMENT(
                                                                        "NUMBER",
                                                                        D.DEPTNO
                                                                       ),
                                                             XMLELEMENT(
                                                                        "NAME",
                                                                        MAX(D.DNAME)
                                                                       ),
                                                             XMLELEMENT(
                                                                        "LOCATION",
                                                                        MAX(D.LOC)
                                                                       ),
                                                             XMLELEMENT(
                                                                        "EMPLOYEES",
                                                                        XMLAGG(
                                                                               XMLELEMENT(
                                                                                          "EMPLOYEE",
                                                                                          XMLELEMENT(
                                                                                                     "EMPNO",
                                                                                                     E.EMPNO
                                                                                                    ),
                                                                                          XMLELEMENT(
                                                                                                     "ENAME",
                                                                                                     E.ENAME
                                                                                                    ),
                                                                                          XMLELEMENT(
                                                                                                     "JOB",
                                                                                                     E.JOB
                                                                                                    ),
                                                                                          XMLELEMENT(
                                                                                                     "SAL",
                                                                                                     E.SAL
                                                                                                    )
                                                                                         )
                                                                                  )
                                                                       )
                                                            )
                                                 )
                                          )
                               )
                     INDENT
                       SIZE = 2
                    ) ORGANIZATION
  FROM  DEPT D,
        EMP E
  WHERE E.DEPTNO = D.DEPTNO
  GROUP BY D.DEPTNO
/

ORGANIZATION
---------------------------------------------------------
<ORGANIZATION>
  <DEPARTMENTS>
    <DEPARTMENT>
      <NUMBER>10</NUMBER>
      <NAME>ACCOUNTING</NAME>
      <LOCATION>NEW YORK</LOCATION>
      <EMPLOYEES>
        <EMPLOYEE>
          <EMPNO>7782</EMPNO>
          <ENAME>CLARK</ENAME>
          <JOB>MANAGER</JOB>
          <SAL>2450</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7934</EMPNO>
          <ENAME>MILLER</ENAME>
          <JOB>CLERK</JOB>
          <SAL>1300</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7839</EMPNO>
          <ENAME>KING</ENAME>
          <JOB>PRESIDENT</JOB>
          <SAL>5000</SAL>
        </EMPLOYEE>
      </EMPLOYEES>
    </DEPARTMENT>
    <DEPARTMENT>
      <NUMBER>20</NUMBER>
      <NAME>RESEARCH</NAME>
      <LOCATION>DALLAS</LOCATION>
      <EMPLOYEES>
        <EMPLOYEE>
          <EMPNO>7369</EMPNO>
          <ENAME>SMITH</ENAME>
          <JOB>CLERK</JOB>
          <SAL>800</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7902</EMPNO>
          <ENAME>FORD</ENAME>
          <JOB>ANALYST</JOB>
          <SAL>3000</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7876</EMPNO>
          <ENAME>ADAMS</ENAME>
          <JOB>CLERK</JOB>
          <SAL>1100</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7788</EMPNO>
          <ENAME>SCOTT</ENAME>
          <JOB>ANALYST</JOB>
          <SAL>3000</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7566</EMPNO>
          <ENAME>JONES</ENAME>
          <JOB>MANAGER</JOB>
          <SAL>2975</SAL>
        </EMPLOYEE>
      </EMPLOYEES>
    </DEPARTMENT>
    <DEPARTMENT>
      <NUMBER>30</NUMBER>
      <NAME>SALES</NAME>
      <LOCATION>CHICAGO</LOCATION>
      <EMPLOYEES>
        <EMPLOYEE>
          <EMPNO>7499</EMPNO>
          <ENAME>ALLEN</ENAME>
          <JOB>SALESMAN</JOB>
          <SAL>2600</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7900</EMPNO>
          <ENAME>JAMES</ENAME>
          <JOB>CLERK</JOB>
          <SAL>950</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7844</EMPNO>
          <ENAME>TURNER</ENAME>
          <JOB>SALESMAN</JOB>
          <SAL>1500</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7698</EMPNO>
          <ENAME>BLAKE</ENAME>
          <JOB>MANAGER</JOB>
          <SAL>2850</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7654</EMPNO>
          <ENAME>MARTIN</ENAME>
          <JOB>SALESMAN</JOB>
          <SAL>1250</SAL>
        </EMPLOYEE>
        <EMPLOYEE>
          <EMPNO>7521</EMPNO>
          <ENAME>WARD</ENAME>
          <JOB>SALESMAN</JOB>
          <SAL>1250</SAL>
        </EMPLOYEE>
      </EMPLOYEES>
    </DEPARTMENT>
  </DEPARTMENTS>
</ORGANIZATION>


SQL> 


SY.

Сообщение было отредактировано: 2 янв 19, 17:57
2 янв 19, 17:56    [21777635]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
SY,

если есть время и натхнення

уровней больше одного (deptno, job, enpno)?
напр
  1  select d.deptno,d.dname,e.job,e.empno,e.ename,e.sal
  2* from dept d,emp e where d.deptno=e.deptno order by d.deptno,e.job
SQL> /

    DEPTNO DNAME          JOB            EMPNO ENAME             SAL
---------- -------------- --------- ---------- ---------- ----------
        10 ACCOUNTING     CLERK           7934 MILLER           1300
                          MANAGER         7782 CLARK            2450
                          PRESIDENT       7839 KING             5000
        20 RESEARCH       ANALYST         7788 SCOTT            3000
                                          7902 FORD             3000
                          CLERK           7369 SMITH             800
                                          7876 ADAMS            1100
                          MANAGER         7566 JONES            2975
        30 SALES          CLERK           7900 JAMES             950
                          MANAGER         7698 BLAKE            2850
                          SALESMAN        7499 ALLEN            1600
                                          7521 WARD             1250
                                          7654 MARTIN           1250
                                          7844 TURNER           1500




.....
stax
2 янв 19, 19:34    [21777658]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
WITH T AS (
           SELECT  DEPTNO,
                   JOB,
                   XMLELEMENT(
                              "EMPLOYEES",
                               XMLAGG(
                                      XMLELEMENT(
                                                 "EMPLOYEE",
                                                 XMLELEMENT(
                                                            "NUMBER",
                                                            EMPNO
                                                           ),
                                                 XMLELEMENT(
                                                            "NAME",
                                                            ENAME
                                                           ),
                                                 XMLELEMENT(
                                                            "SALARY",
                                                            SAL
                                                           )
                                                )
                                     )
                             ) JOB_EMPLOYEES
              FROM  EMP
              GROUP BY DEPTNO,
                       JOB
           )
SELECT  XMLSERIALIZE(
                     DOCUMENT
                     XMLELEMENT(
                                "ORGANIZATION",
                                XMLELEMENT(
                                           "DEPARTMENTS",
                                           XMLAGG(
                                                  XMLELEMENT(
                                                             "DEPARTMENT",
                                                             XMLELEMENT(
                                                                        "NUMBER",
                                                                        D.DEPTNO
                                                                       ),
                                                             XMLELEMENT(
                                                                        "NAME",
                                                                        MAX(D.DNAME)
                                                                       ),
                                                             XMLELEMENT(
                                                                        "LOCATION",
                                                                        MAX(D.LOC)
                                                                       ),
                                                             XMLELEMENT(
                                                                        "JOBS",
                                                                        XMLAGG(
                                                                               XMLELEMENT(
                                                                                          "JOB",
                                                                                          XMLELEMENT(
                                                                                                     "TITLE",
                                                                                                     T.JOB
                                                                                                    ),
                                                                                          T.JOB_EMPLOYEES
                                                                                         )
                                                                              )
                                                                       )
                                                            )
                                                 )
                                          )
                               )
                     INDENT
                       SIZE = 2
                    ) ORGANIZATION
  FROM  DEPT D,
        T
  WHERE T.DEPTNO = D.DEPTNO
  GROUP BY D.DEPTNO
/

ORGANIZATION
---------------------------------------------
<ORGANIZATION>
  <DEPARTMENTS>
    <DEPARTMENT>
      <NUMBER>10</NUMBER>
      <NAME>ACCOUNTING</NAME>
      <LOCATION>NEW YORK</LOCATION>
      <JOBS>
        <JOB>
          <TITLE>CLERK</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7934</NUMBER>
              <NAME>MILLER</NAME>
              <SALARY>1300</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
        <JOB>
          <TITLE>PRESIDENT</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7839</NUMBER>
              <NAME>KING</NAME>
              <SALARY>5000</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
        <JOB>
          <TITLE>MANAGER</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7782</NUMBER>
              <NAME>CLARK</NAME>
              <SALARY>2450</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
      </JOBS>
    </DEPARTMENT>
    <DEPARTMENT>
      <NUMBER>20</NUMBER>
      <NAME>RESEARCH</NAME>
      <LOCATION>DALLAS</LOCATION>
      <JOBS>
        <JOB>
          <TITLE>CLERK</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7369</NUMBER>
              <NAME>SMITH</NAME>
              <SALARY>800</SALARY>
            </EMPLOYEE>
            <EMPLOYEE>
              <NUMBER>7876</NUMBER>
              <NAME>ADAMS</NAME>
              <SALARY>1100</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
        <JOB>
          <TITLE>MANAGER</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7566</NUMBER>
              <NAME>JONES</NAME>
              <SALARY>2975</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
        <JOB>
          <TITLE>ANALYST</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7788</NUMBER>
              <NAME>SCOTT</NAME>
              <SALARY>3000</SALARY>
            </EMPLOYEE>
            <EMPLOYEE>
              <NUMBER>7902</NUMBER>
              <NAME>FORD</NAME>
              <SALARY>3000</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
      </JOBS>
    </DEPARTMENT>
    <DEPARTMENT>
      <NUMBER>30</NUMBER>
      <NAME>SALES</NAME>
      <LOCATION>CHICAGO</LOCATION>
      <JOBS>
        <JOB>
          <TITLE>CLERK</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7900</NUMBER>
              <NAME>JAMES</NAME>
              <SALARY>950</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
        <JOB>
          <TITLE>SALESMAN</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7499</NUMBER>
              <NAME>ALLEN</NAME>
              <SALARY>2600</SALARY>
            </EMPLOYEE>
            <EMPLOYEE>
              <NUMBER>7844</NUMBER>
              <NAME>TURNER</NAME>
              <SALARY>1500</SALARY>
            </EMPLOYEE>
            <EMPLOYEE>
              <NUMBER>7654</NUMBER>
              <NAME>MARTIN</NAME>
              <SALARY>1250</SALARY>
            </EMPLOYEE>
            <EMPLOYEE>
              <NUMBER>7521</NUMBER>
              <NAME>WARD</NAME>
              <SALARY>1250</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
        <JOB>
          <TITLE>MANAGER</TITLE>
          <EMPLOYEES>
            <EMPLOYEE>
              <NUMBER>7698</NUMBER>
              <NAME>BLAKE</NAME>
              <SALARY>2850</SALARY>
            </EMPLOYEE>
          </EMPLOYEES>
        </JOB>
      </JOBS>
    </DEPARTMENT>
  </DEPARTMENTS>
</ORGANIZATION>


SQL> 


SY.

Сообщение было отредактировано: 2 янв 19, 21:11
2 янв 19, 20:49    [21777676]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
SY
                                                                                                     "TITLE",
За такие отступы надо отрывать руки.
IMHO
3 янв 19, 07:34    [21777791]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
SY,

Спасибо, я так примерно и делал
Надеялся что есть какой-то трюк

.....
stax
3 янв 19, 09:34    [21777815]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Прочитал, большое спасибо за примеры. Что напрягает меня в тернистом пути поиска правильного решения - большой объем выборки на основе которой будет строиться XML - порядка 1,5 миллионов строк данных в базовой таблице, к которой будет подтягиваться детализация раз в 5 больше... Раньше все это из запроса по порциям складировалось в CSV (делалось на толстом клиенте, там еще ряд постдействий не связанных с выгрузкой делался потому и на толстом) .

Допустим здесь тоже порционно можно писать, а потом на трансформе это не умрет ?
5 янв 19, 11:10    [21778684]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Elic
Member

Откуда:
Сообщений: 29990
Dual_Bios
будет строиться XML - порядка 1,5 миллионов строк данных в базовой таблице, к которой будет подтягиваться детализация раз в 5 больше...
Dual_Bios
а потом на трансформе это не умрет ?
Нужно задаться вопросом, а не поперхнётся ли следующий приёмник.

Архитекторы всё больше дебилизируются…
5 янв 19, 11:22    [21778686]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результатов запроса в XML по известной структуре  [new]
Dual_Bios
Member

Откуда:
Сообщений: 21
Elic, таковы требования сторонней организации (монополиста), которой мы передаем файл с данными, читать-то наверно легче чем писать..
5 янв 19, 11:50    [21778693]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить