ORACLE, XMLAGG (аргумент), нулевой аргумент - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть запрос:

SELECT  xmlelement("Response",
            xmlelement("hist",
              xmlelement("details",
                xmlagg(x.node)))
          ) AS XML_HIST,
          x.cnt
 FROM     (
            SELECT  null AS node,
                    COUNT(1) OVER() AS cnt
            FROM    dual
            --WHERE 1=2
         ) x
  GROUP BY x.cnt

Запрос x был выполнен как есть для этого вопроса (конфиденциальные данные).

Когда запрос x возвращает какие-либо данные, все в порядке.Но когда в таблице нет записей (здесь: WHERE 1 = 2), мой код в пакете завершается с ошибкой no_data_found.

Я пытаюсь найти выражение, отличное от

<<inner_block>>
begin
SELECT..
exception
when others then...
end inner_block;

я пытался сделать что-то вроде

SELECT  MAX(xmlelement("docGetPackageHistoryResponse",
            xmlelement("histories",
              xmlelement("contract-history",
                xmlagg(x.node)))
          )) AS XML_HIST,
    MAX(cnt)

, но я получаю ошибку ORA-22950: невозможно заказать объекты без метода MAP или ORDER.

Есть идеи?Спасибо:)

PS пожалуйста, не задавайте мне вопросы типа "почему вы избегаете решения внутреннего блока?".

1 Ответ

0 голосов
/ 12 декабря 2018

Ошибка в применении агрегата max() к элементу XMLEle, что на самом деле не имеет смысла;и без этого он ведет себя так же, как ваш исходный запрос.

Я думаю, что вы просто агрегируете не в ту точку;Вы можете сделать это:

SELECT xmlelement("Response",
         xmlelement("hist",
           xmlelement("details",
             (
               SELECT xmlagg(x.node)
               FROM (
                 SELECT null AS node,
                        COUNT(1) OVER() AS cnt
                 FROM   dual
                 WHERE 1=2
               ) x
               GROUP BY x.cnt
             )
           )
         )
       ) AS XML_HIST
FROM dual
/

XML_HIST                                                                        
--------------------------------------------------------------------------------
<Response><hist><details></details></hist></Response>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...