Иллюстрированный самоучитель по PostgreSQL

Включение внешних источников данных

Работа с полями

При итеративном выполнении блока включения SQL возможны два варианта обращения к значениям полей: можно воспользоваться общим тегом <field> или объектом this, который заполняется значениями всех полей для текущей итерации.

Как и при включении XML, тег <field> может содержать атрибут name, идентифицирующий выводимое поле. В противном случае поля выводятся последовательными тегами <field> в порядке их перечисления в запросе (слева направо).

Кроме того, к значениям полей можно обращаться при помощи конструкции this. поле, где поле – имя поля. Например, во включенном блоке SQL следующие два тега выводят одинаковый результат:

<field name="id" /> <putvar name="this.id" />

Объект this поддерживается в основном ради применения условных тегов и подстановки переменных с данными, возвращаемыми в итоговых наборах SQL. В листинге 13.28 приведен пример запроса SQL и форматирования выходных данных с применением условных тегов.

Листинг 13.28. Включение результатов запроса SQL.

<lхр>
<include sql="SELECT datname .datdba AS userjd FROM pg_database">
<if this.user_id="$userid">
<strong><field /></strong><br />
<setvar owned_databases="$owned_databases @this.datname" /> </if> <else>
<field /><br />
</else>
</include>
</lxp>

Работа с метаданными SQL

При выполнении запросов SQL объект LXP с именем sql заполняется информацией о полученном итоговом наборе. Он содержит переменные sql.numrows, sql.numcols, sql.numfields (псевдоним для sql.numcols), sql.rown sql.offset.

Переменная sql.numrows содержит количество записей, полученных в результате запроса. Переменная sql.numcols (а также ее псевдоним sql.numfields) содержит количество полей в каждой записи. При итеративном выполнении блока, заключенного между <include> и </include>, переменная sql .row содержит числовой индекс текущей записи, начиная с 1, а переменная sql.offset – числовой индекс, начиная с 0.

В листинге 13.29 переменная sql.row используется для вывода индекса текущей записи в блоке <include>. После вывода результатов запроса переменная sql.numrows выводит количество выбранных записей.

Листинг 13.29. Использование объектной переменной sql.

<lхр>
<include sqVSELECT * FROM pg_user ORDER BY usename LIMIT 5">
User #<putvar name="sql.row" />: <putvar name="this.usename"
/><br />
</include>
<br />
Selected <putvar name="sql.numrows" /> rows.
</lxp>

Результат выполнения листинга 13.29 выглядит так:

User #1: alien<br />
User #2: barbara<br />
User #3: ben<br />
User #4: corwin<br />
User #5: david<br />
<br />
Selected 5 rows.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.