Петли курсора; Как выполнить что-либо только в начале / конце цикла 1 раз? - PullRequest
1 голос
/ 12 апреля 2010

В одной из процедур Oracle у меня есть следующее, я использую его для генерации XML

  -- v_client_addons is set to '' to avoid null error
  OPEN C_CLIENT_ADDONS;
  LOOP
    FETCH C_CLIENT_ADDONS INTO CLIENT_ADDONS;
    EXIT WHEN C_CLIENT_ADDONS%NOTFOUND;
    BEGIN
      v_client_addons := v_client_addons || CLIENT_ADDONS.XML_DATA;
    END;
  END LOOP;
  CLOSE C_CLIENT_ADDONS;

  -- Do something later with v_client_addons

Цикл должен пройти через мой курсор и выбрать все отображаемые значения XML, например:

<add-on name="some addon"/>
<add-on name="another addon"/>

Чего я хотел бы добиться, так это иметь в этом цикле тег начала / конца XML, чтобы у меня был следующий вывод

<addons>
   <add-on name="some addon"/>
   <add-on name="another addon"/>
</addons>

Как я могу сделать это без тега <addons> после каждой строки? Если в курсоре нет надстроек (курсор пуст), я бы хотел пропустить эту часть enitrely

Ответы [ 2 ]

2 голосов
/ 12 апреля 2010

Как насчет использования SQL для генерации всего XML вместо циклического перемещения курсора?

SELECT XMLELEMENT("addons", XMLAGG(C.XML_DATA)) INTO v_client_addons 
FROM CLIENT_ADDON_TABLE C;
2 голосов
/ 12 апреля 2010

проверить длину v_client_addons. Если оно больше 0, вы на самом деле что-то добавили. Затем создайте родительский тег со своими дочерними элементами, иначе просто проигнорируйте его.

...