Форум программистов, компьютерный форум, киберфорум
Наши страницы
Oracle
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Disite
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 52
1

Вставка нескольких значений из xmltable в бд

20.06.2016, 13:55. Просмотров 1131. Ответов 11
Метки нет (Все метки)

Здравствуйте. Возникла необходимость вставить несколько значений requirement в таблицу agg. Подскажите, каким образом это можно осуществить? В данном запросе работает вставка только первого значения, а нужны все три. Заранее спасибо!
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INSERT INTO test
     VALUES (4,xmltype (
     '<export>
      <responsibleOrg>
      <regNum>01731000018</regNum>
      </responsibleOrg>
      <requirements>
                <requirement>
                    <code>8403975</code>
                    <name>Требование об отсутствии в предусмотренном Федеральным законом № 44-ФЗ реестре недобросовестных поставщиков </name>
                </requirement>
                <requirement>
                    <code>8632410</code>
                    <name>Единые требования к участникам </name>
                </requirement>
                <requirement>
                    <code>8361978</code>
                    <name>Иные дополнительные требования к участникам </name>
                </requirement>
            </requirements>
  </export>'));
Вот запрос:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
DECLARE res NUMBER;
BEGIN  
FOR r IN
(
SELECT t.id
FROM test t
)loop
sys.DBMS_OUTPUT.put_line('Номер файла №'|| ' '||r.id);
FOR r2 IN
(
SELECT x.*,k.*
     FROM test t,
          xmltable('export/responsibleOrg'
                   passing t.data
                   COLUMNS
                  regnum varchar2(50) path 'regNum')k,
          
          XMLTABLE ('export/requirements/requirement'
                    PASSING t.data
                    COLUMNS 
                            code VARCHAR2(100) PATH 'code',
                            name varchar2(100) path 'name') x
           WHERE t.id = 4
 )loop 
 
IF r2.regNum IS NOT NULL THEN
 
SELECT COUNT(*)
INTO res
FROM agg a
WHERE a.regNum = r2.regNum;
IF res = 0 THEN
INSERT INTO agg(REGNUM,code,name)VALUES(r2.regnum,r2.code,r2.name);
END IF;
END IF;
END loop;
END loop;
END;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2016, 13:55
Ответы с готовыми решениями:

Апдейт нескольких значений уникальными данными
Вобщем суть такова, есть запрос, который возвращает нам некорректные записи,...

Хранение значений с возможностью одновременного добавления/изменения с нескольких пользователей
Здравствуйте. Есть такие проблемные списки, как список друзей, закладки на...

Вставка одного из нескольких значений в таблицу
Здрасьте! Подскажите, каким образом прописать в Delphi такую ситуацию: 3...

Запрос на разницу значений при отсутствии нескольких показателей в одном из значений
Добрый вечер! Прошу прощения за возможно глупый вопрос, но для меня это...

Возврат нескольких значений из метода не знаем сколько таких значений
Здравствуйте! Собственно вопрос: как возвращать &lt;несколько&gt; значений из метода...

11
AGK
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,157
20.06.2016, 14:59 2
Может я чего-нибудь не понял, но вставка только первого значения, на мой взгляд, идет потому, что именно на нем res=0.
Селект
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT x.*,k.*
     FROM test t,
          xmltable('export/responsibleOrg'
                   passing t.DATA
                   COLUMNS
                  regnum varchar2(50) path 'regNum')k,
          
          XMLTABLE ('export/requirements/requirement'
                    PASSING t.DATA
                    COLUMNS 
                            code VARCHAR2(100) PATH 'code',
                            name varchar2(100) path 'name') x
           WHERE t.id = 4

возвращает все три значения, поэтому, на мой взгляд, достаточно убрать навороты, назначение которых непонятно, а именно, закомментировать все лишнее
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
IF r2.regNum IS NOT NULL THEN
-- SELECT COUNT(*)
-- INTO res
-- FROM agg a
-- WHERE a.regNum = r2.regNum;
-- IF res = 0 THEN
INSERT INTO agg(REGNUM,code,name)VALUES(r2.regnum,r2.code,r2.name);
-- END IF;
END IF;

И сразу вставятся все три строки
0
Disite
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 52
20.06.2016, 15:16  [ТС] 3
Эти навороты нужны для предотвращения вставки значений,которые уже существуют в таблице.Если их убрать,то да,он выводит 3 строки.Спасибо,не обратил внимание).Можете тогда посоветовать,каким образом в данном случае предотвратить вставку уже существующих значений?
0
AGK
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,157
20.06.2016, 15:30 4
Цитата Сообщение от Disite Посмотреть сообщение
каким образом ... предотвратить вставку уже существующих значений?
Правильно ли я понимаю, что нельзя повторно вставлять запись, все три поля которой совпадают по значениям с какой-то другой ранее вставленной записью? Есть ли уникальный индекс?
0
Disite
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 52
20.06.2016, 15:56  [ТС] 5
То есть, если уже существует такой primary key, то запись не должна быть вставлена. Смысл в этом.
0
AGK
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,157
20.06.2016, 17:22 6
Предлагаю вместо INSERT использовать MERGE. Как-то так. Попробовал, сработало
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DECLARE res NUMBER;
BEGIN  
FOR r IN
(
SELECT t.id
FROM test t
)loop
sys.DBMS_OUTPUT.put_line('Номер файла №'|| ' '||r.id);
MERGE INTO agg a
USING 
(    SELECT x.*,k.*
     FROM test t,
          xmltable('export/responsibleOrg'
                   passing t.DATA
                   COLUMNS
                  regnum varchar2(50) path 'regNum')k,
          
          XMLTABLE ('export/requirements/requirement'
                    PASSING t.DATA
                    COLUMNS 
                            code VARCHAR2(100) PATH 'code',
                            name varchar2(100) path 'name') x
           WHERE t.id = r.id
) b
ON (a.regnum=b.regnum AND 
    a.code=b.code AND
    a.name=b.name)
-- WHEN matched THEN ------
WHEN NOT matched THEN
      INSERT (a.regnum, a.code, a.name)
      VALUES (b.regnum, b.code, b.name)
;      
END loop;
END;

Если не делать DBMS_OUTPUT.put_line, то, скорее всего, можно вообще обойтись одним MERGE без LOOP

Добавлено через 3 минуты
На всякий случай попробую уточнить, что будет, если в одном операторе вставляются две одинаковые записи.

Добавлено через 24 минуты
М-да, если в селекте есть одинаковые строки, то они обе вставляются. Так что надо DISTINCT ставить в оператор
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DECLARE res NUMBER;
BEGIN  
FOR r IN
(
SELECT t.id
FROM test t
)loop
sys.DBMS_OUTPUT.put_line('Номер файла №'|| ' '||r.id);
MERGE INTO agg a
USING 
(    SELECT DISTINCT x.*,k.*
     FROM test t,
          xmltable('export/responsibleOrg'
                   passing t.DATA
                   COLUMNS
                  regnum varchar2(50) path 'regNum')k,
          
          XMLTABLE ('export/requirements/requirement'
                    PASSING t.DATA
                    COLUMNS 
                            code VARCHAR2(100) PATH 'code',
                            name varchar2(100) path 'name') x
           WHERE t.id = r.id
) b
ON (a.regnum=b.regnum AND 
    a.code=b.code AND
    a.name=b.name)
-- WHEN matched THEN ------
WHEN NOT matched THEN
      INSERT (a.regnum, a.code, a.name)
      VALUES (b.regnum, b.code, b.name)
;      
END loop;
END;

Не видит оператор строки, вставленные ранее в том же MERGE
0
Disite
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 52
20.06.2016, 17:58  [ТС] 7
Огромное спасибо,воспользовался вашим советом.Если вам не сложно,не могли бы помочь еще один нюанс устранить?
Мне нужно из данных в нескольких связанных таблицах собрать xml файл.Всё бы хорошо,но отказывается работать функция xmlagg.Она мне нужна для случая,если есть несколько одинаковых тегов, т.е. например:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<attachments>
            <attachment>
             <publishedContentId>282E453ABCF200</publishedContentId>
            <filename>aaa</filename>
 
            <attachment>
             <publishedContentId>634t6467432267g</publishedContentId>
            <filename>bbb</filename>
             
             <attachment>
             <publishedContentId>52837H85320UT32</publishedContentId>
            <filename>ccc</filename>
</attachments>
Вот собственно сам код:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT xmlroot(
        xmlelement("ns2:export",
        xmlattributes('http://zakupki.gov.ru/oos/types/1'AS "xmlns",'http://zakupki.gov.ru/oos/export/1'AS "xmlns:ns2",'http://zakupki.gov.ru/oos/printform/1' AS "xmlns:ns3"),
        xmlelement("ns2:fcsNotificationCancelFailure",
        xmlattributes(n.SCHEMEVERSION AS "schemeVersion"),
          xmlelement("id",n.id),
        decode(n.docPublishDate,NULL,NULL,xmlelement("docPublishDate",n.docPublishDate)),
        decode(n.PurchaseObjectInfo,NULL,NULL,xmlelement("purchaseObjectInfo",n.PurchaseObjectInfo)),
        xmlelement("purchaseResponsible",
        xmlelement("responsibleOrg",
        decode(n.regnum,NULL,NULL,xmlelement("regNum",n.RegNum)),
        decode(o.fullname,NULL,NULL,xmlelement("fullName",o.fullname))),
        decode(o.ResponsibleRole,NULL,NULL,xmlelement("responsibleRole",o.ResponsibleRole)),
        xmlelement("responsibleInfo",
        decode(o.OrgPostAdress,NULL,NULL,xmlelement("orgPostAddress",o.OrgPostAdress)))),
        xmlelement("placingWay",
        decode(n.Code_P,NULL,NULL,xmlelement("code",n.Code_P))),
        xmlelement("ETP",
        decode(n.Code_E,NULL,NULL,xmlelement("code",n.Code_E))),
        xmlelement("attachments",
        xmlagg(xmlelement("attachment",
        xmlelement("publishedContentId",a.PublishContentId),
        xmlelement("fileName",a.FileName)))))),version '1.0" encoding="UTF-8' ,STANDALONE YES)            
FROM NOTIFICATIONS n,ORGANISATIONS o,ATTACHMENTS a
WHERE o.regnum=n.regnum AND n.id=a.id
GROUP BY a.PublishContentId;
decode я использую для проверки на пустые значения в тегах.
Запрос выдает ошибку not a GROUP BY expression.

Добавлено через 10 минут
AGK, или же всё таки тут нужно по нескольким параметрам группировать?
0
AGK
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,157
20.06.2016, 19:17 8
Я несколько переписал Ваш селект. Думаю, так он сработает. Но нужен еще один "внешний" xmlagg, мне кажется. Либо селект надо как-то переделывать. Этого я пока не могу точно сказать, надо подумать
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
SELECT xmlroot
        (
        xmlelement("ns2:export",
                xmlattributes('http://zakupki.gov.ru/oos/types/1'AS "xmlns",
                              'http://zakupki.gov.ru/oos/export/1'AS "xmlns:ns2",
                              'http://zakupki.gov.ru/oos/printform/1' AS "xmlns:ns3"),
                xmlelement("ns2:fcsNotificationCancelFailure",
                            xmlattributes(n.SCHEMEVERSION AS "schemeVersion"),
                            xmlelement("id",n.id),
                            decode(n.docPublishDate,NULL,NULL,xmlelement("docPublishDate",n.docPublishDate)),
                            decode(n.PurchaseObjectInfo,NULL,NULL,xmlelement("purchaseObjectInfo",n.PurchaseObjectInfo)),
                            xmlelement("purchaseResponsible",
                                        xmlelement("responsibleOrg",
                                            decode(n.regnum,NULL,NULL,xmlelement("regNum",n.RegNum)),
                                            decode(o.fullname,NULL,NULL,xmlelement("fullName",o.fullname))
                                          ),
                                decode(o.ResponsibleRole,NULL,NULL,xmlelement("responsibleRole",o.ResponsibleRole)),
                                xmlelement("responsibleInfo",
                                    decode(o.OrgPostAdress,NULL,NULL,xmlelement("orgPostAddress",o.OrgPostAdress))
                                  )
                              ),
                            xmlelement("placingWay",
                                decode(n.Code_P,NULL,NULL,xmlelement("code",n.Code_P))
                             ),
                            xmlelement("ETP",
                                decode(n.Code_E,NULL,NULL,xmlelement("code",n.Code_E))
                              ),
                            xmlelement("attachments",
                               (SELECT xmlagg(
                                        xmlelement("attachment",
                                            xmlelement("publishedContentId",a.PublishContentId),
                                            xmlelement("fileName",a.FileName)
                                          )
                                        )
                                FROM ATTACHMENTS a WHERE a.id=n.id
                               )
                              )
                    )
                ),  version '1.0" encoding="UTF-8' ,STANDALONE YES)            
FROM NOTIFICATIONS n, ORGANISATIONS o,
WHERE o.regnum=n.regnum 
;


Добавлено через 28 минут
Я бы что-нибудь в таком духе сделал
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
SELECT xmlroot
        (
         (SELECT xmlagg 
          (
           xmlelement("ns2:export",
                xmlattributes('http://zakupki.gov.ru/oos/types/1'AS "xmlns",
                              'http://zakupki.gov.ru/oos/export/1'AS "xmlns:ns2",
                              'http://zakupki.gov.ru/oos/printform/1' AS "xmlns:ns3"),
                xmlelement("ns2:fcsNotificationCancelFailure",
                            xmlattributes(n.SCHEMEVERSION AS "schemeVersion"),
                            xmlelement("id",n.id),
                            decode(n.docPublishDate,NULL,NULL,xmlelement("docPublishDate",n.docPublishDate)),
                            decode(n.PurchaseObjectInfo,NULL,NULL,xmlelement("purchaseObjectInfo",n.PurchaseObjectInfo)),
                            xmlelement("purchaseResponsible",
                                        xmlelement("responsibleOrg",
                                            decode(n.regnum,NULL,NULL,xmlelement("regNum",n.RegNum)),
                                            decode(o.fullname,NULL,NULL,xmlelement("fullName",o.fullname))
                                          ),
                                decode(o.ResponsibleRole,NULL,NULL,xmlelement("responsibleRole",o.ResponsibleRole)),
                                xmlelement("responsibleInfo",
                                    decode(o.OrgPostAdress,NULL,NULL,xmlelement("orgPostAddress",o.OrgPostAdress))
                                  )
                              ),
                            xmlelement("placingWay",
                                decode(n.Code_P,NULL,NULL,xmlelement("code",n.Code_P))
                             ),
                            xmlelement("ETP",
                                decode(n.Code_E,NULL,NULL,xmlelement("code",n.Code_E))
                              ),
                            xmlelement("attachments",
                               (SELECT xmlagg(
                                        xmlelement("attachment",
                                            xmlelement("publishedContentId",a.PublishContentId),
                                            xmlelement("fileName",a.FileName)
                                          )
                                         ORDER BY a.PublishContentId)
                                FROM ATTACHMENTS a WHERE a.id=n.id
                               )
                              )
                    )
                )
          ORDER BY  n.id)   
    FROM NOTIFICATIONS n, ORGANISATIONS o
    WHERE o.regnum=n.regnum ),  version '1.0" encoding="UTF-8' ,STANDALONE YES)            
FROM dual    
;

По крайней мере, на моей базе на трех связанных таблицах получается разумный xml. Но это ничего не значит, разумеется. На другой базе может быть иначе. Попробуйте и дайте знать, что получилось
0
Disite
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 52
20.06.2016, 19:44  [ТС] 9
Вот что получилось:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:export xmlns="http://zakupki.gov.ru/oos/types/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns3="http://zakupki.gov.ru/oos/printform/1">
  <ns2:fcsNotificationCancelFailure schemeVersion="5.0">
    <id>5012335</id>
    <docPublishDate>02.07.03</docPublishDate>
    <purchaseObjectInfo>Заказ на чистку бассейна</purchaseObjectInfo>
    <purchaseResponsible>
      <responsibleOrg>
        <regNum>114765</regNum>
        <fullName>Организация по защите прав человек</fullName>
      </responsibleOrg>
      <responsibleRole>PC</responsibleRole>
      <responsibleInfo>
        <orgPostAddress>г.Воронеж</orgPostAddress>
      </responsibleInfo>
    </purchaseResponsible>
    <placingWay>
      <code>ZP43</code>
    </placingWay>
    <ETP>
      <code>OOKJN</code>
    </ETP>
    <attachments/>
  </ns2:fcsNotificationCancelFailure>
</ns2:export>
<ns2:export xmlns="http://zakupki.gov.ru/oos/types/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns3="http://zakupki.gov.ru/oos/printform/1">
  <ns2:fcsNotificationCancelFailure schemeVersion="5.1">
    <id>5658843</id>
    <docPublishDate>03.45.78</docPublishDate>
    <purchaseObjectInfo>Заказ на поход в продуктовый магазин</purchaseObjectInfo>
    <purchaseResponsible>
      <responsibleOrg>
        <regNum>1155624</regNum>
        <fullName>Организация по защите прав Overwatch</fullName>
      </responsibleOrg>
      <responsibleRole>ES</responsibleRole>
      <responsibleInfo>
        <orgPostAddress>г.Москва</orgPostAddress>
      </responsibleInfo>
    </purchaseResponsible>
    <placingWay>
      <code>EAP44</code>
    </placingWay>
    <ETP>
      <code>JGKLJ</code>
    </ETP>
    <attachments>
      <attachment>
        <publishedContentId>12236</publishedContentId>
        <fileName>ue8.pdf</fileName>
      </attachment>
      <attachment>
        <publishedContentId>13553</publishedContentId>
        <fileName>pf.txt</fileName>
      </attachment>
      <attachment>
        <publishedContentId>46586</publishedContentId>
        <fileName>sdf.pdf</fileName>
      </attachment>
    </attachments>
  </ns2:fcsNotificationCancelFailure>
</ns2:export>
<ns2:export xmlns="http://zakupki.gov.ru/oos/types/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns3="http://zakupki.gov.ru/oos/printform/1">
  <ns2:fcsNotificationCancelFailure schemeVersion="5.2">
    <id>5954320</id>
    <docPublishDate>14.23.95</docPublishDate>
    <purchaseObjectInfo>Заказ на чистку двора</purchaseObjectInfo>
    <purchaseResponsible>
      <responsibleOrg>
        <regNum>123514</regNum>
        <fullName>Организация по защите прав животных</fullName>
      </responsibleOrg>
      <responsibleRole>CW</responsibleRole>
      <responsibleInfo>
        <orgPostAddress>г.Калуга</orgPostAddress>
      </responsibleInfo>
    </purchaseResponsible>
    <placingWay>
      <code>EZ32</code>
    </placingWay>
    <ETP>
      <code>REWE</code>
    </ETP>
    <attachments>
      <attachment>
        <publishedContentId>45566</publishedContentId>
        <fileName>fde.txt</fileName>
      </attachment>
      <attachment>
        <publishedContentId>63254</publishedContentId>
        <fileName>Pun.xml</fileName>
      </attachment>
    </attachments>
  </ns2:fcsNotificationCancelFailure>
</ns2:export>
Всё отлично, но всё таки лучше когда агрегация происходит только по attachments, то есть остальные теги агрегировать в принципе не нужно, но за код спасибо,в будущем очень пригодится данная структура. Правда, возникла необходимость записать код в функцию для дальнейшей работы, но в результате ее работы получаем 3 одинаковых значения, чего не должно быть. Без функции всё ок.Странно как то.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CREATE OR REPLACE FUNCTION genXML(parametr varchar2) RETURN CLOB AS
a xmltype;
b CLOB;
BEGIN
SELECT xmlroot(
                    xmlelement("ns2:export",
                    xmlattributes('http://zakupki.gov.ru/oos/types/1'AS "xmlns",
                    'http://zakupki.gov.ru/oos/export/1'AS "xmlns:ns2",
                    'http://zakupki.gov.ru/oos/printform/1' AS "xmlns:ns3"),
                    xmlelement("ns2:fcsNotificationCancelFailure",
                    xmlattributes(n.SCHEMEVERSION AS "schemeVersion"),
                    xmlelement("id",n.id),
                    decode(n.docPublishDate,NULL,NULL,xmlelement("docPublishDate",n.docPublishDate)),
                    decode(n.PurchaseObjectInfo,NULL,NULL,xmlelement("purchaseObjectInfo",n.PurchaseObjectInfo)),
                    xmlelement("purchaseResponsible",
                    xmlelement("responsibleOrg",
                    decode(n.regnum,NULL,NULL,xmlelement("regNum",n.RegNum)),
                    decode(o.fullname,NULL,NULL,xmlelement("fullName",o.fullname))),
                    decode(o.ResponsibleRole,NULL,NULL,xmlelement("responsibleRole",o.ResponsibleRole)),
                    xmlelement("responsibleInfo",
                    decode(o.OrgPostAdress,NULL,NULL,xmlelement("orgPostAddress",o.OrgPostAdress)))),
                    xmlelement("placingWay",
                    decode(n.Code_P,NULL,NULL,xmlelement("code",n.Code_P))),
                    xmlelement("ETP",
                    decode(n.Code_E,NULL,NULL,xmlelement("code",n.Code_E))),
                    xmlelement("attachments",
           (SELECT  xmlagg(
                    xmlelement("attachment",
                    xmlelement("publishedContentId",a.PublishContentId),
                    xmlelement("fileName",a.FileName)))
              FROM ATTACHMENTS a WHERE a.id=n.id)))),  
                    version '1.0" encoding="UTF-8' ,STANDALONE YES)    
INTO a
FROM NOTIFICATIONS n, ORGANISATIONS o
WHERE o.regnum=n.regnum AND n.id=parametr;
b:=a.getclobval();
RETURN b;
END genXML;
 
SELECT genXML(5012335) FROM NOTIFICATIONS;
0
AGK
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,157
20.06.2016, 20:13 10
Лучший ответ Сообщение было отмечено Disite как решение

Решение

Цитата Сообщение от Disite Посмотреть сообщение
но в результате ее работы получаем 3 одинаковых значения
Об этом и речь. Если без внешнего агрегирования, то возвращается несколько строк, и получается не один xml, а несколько, причем разных. Посмотрите внимательно, я думаю, судя по приведенному Вами xml и селектам, значения, все-таки, отличаюся. У меня было то же самое: без внешнего агрегирования получилось несколько строчек с разными xml. Поэтому я ранее написал, что для получения одного результирующего xml нужно еще одно внешнее агрегирование. Собственно, все мои рабочие селекты, возвращающие xml, построены на select from dual, а все связанные таблицы селектятся "внутри".

Добавлено через 5 минут
Не использовать dual можно только тогда, когда ваш селект возвращает ровно одну строку. Он и должен вернуть одну, поскольку в противном случае Ваша функция выдаст ошибку.

Добавлено через 3 минуты
Кстати, попробуйте закрыть старую сессию, войти в новую и в функции написать без b : RETURN a.getclobval();
1
Disite
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 52
20.06.2016, 20:39  [ТС] 11
Огромное спасибо за помощь,вы мне очень помогли,могу я вас как-нибудь отблагодарить?
0
AGK
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,157
21.06.2016, 09:50 12
Цитата Сообщение от Disite Посмотреть сообщение
Огромное спасибо за помощь
Пожалуйста

Добавлено через 12 часов 51 минуту
Возможно, для лучшего соотвествия стандарту XML следует после xmlroot поместить обнимающий всех тэг, например <exports> или <document>

Добавлено через 13 минут
Примерно так
SQL
1
2
3
4
5
6
7
8
SELECT xmlroot
        ( xmlelement("exports",
           (SELECT xmlagg 
             ...............
            FROM NOTIFICATIONS n, ORGANISATIONS o
           WHERE o.regnum=n.regnum )
          ) ,  version '1.0" encoding="UTF-8' ,STANDALONE YES)            
FROM dual
0
21.06.2016, 09:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2016, 09:50

Вставка нескольких изображений
Не могу понять как расположить 2 изображения по вертикале, 2ое изображение...

Вставка нескольких таймеров на странице
Добрый день, подскажите, что я делаю не так. Через поиск нашел несколько...

Вставка сразу нескольких кортежей
Привет. Как в таблицу можно вставить сразу несколько записей? Такое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru