Выбрать всех прямых начальников сотрудницы DIANE G. ADAMS

Запрос:
1 declare namespace mySpace = "http://khpi-iip/derev"
2 define function mySpace:getManager($a as element(employee)*)
3  as element(employee)* {
4   for $b in doc('file:///c:/KING/kingx/king_corp.xml')//employee
5     where $b/@id = $a/manager_id
6   return ($a, $b, mySpace:getManager($b))
7 }
8 for $a in doc('file:///c:/KING/kingx/king_corp.xml')//employee[name='DIANE G. ADAMS']
9 return mySpace:getManager($a)/name/text()

Результат:

Это рекурсивный запрос. Мы должны выбрать саму DIANE G. ADAMS, потом - ее начальника, потом - его начальника и т.д.

В SQL это не предусмотрено в стандарте SQL/96. Разные СУБД используют разные средства для решения этой задачи, стандарт SQL/2000 решает ее при помощи рекурсивных временных представлений.

Здесь мы используем рекурсивную функцию. Сначала разберем формальный синтаксис этого запроса:

  • Строка 1 - определение пространства имен и его префикса для функции. Пространство по умолчанию применяется для стандартных функций.
  • Строка 2 - заголовок функции с ее параметрами и их типами и с типом возвращаемого значения.
  • Строки 3-7 - тело функции.
  • Строки 8-9 - запрос, в котором вызывается функция.

Теперь - о семантике запроса.

Функция получает элемент сотрудника, выбирает его менеджера и возвращает полученного сотрудника, менеджера и тот результат, который вернула эта же функция при вызове ее с параметром - менеджером. Все это образует последовательность (берется в круглые скобки).