Сервер:
 
вход в систему
логин:   
пароль:  
 
 
меню
совет

Синтаксис:

<req:Query connection="имя_соединения">
  <req:Request>
    предложение SELECT
  </req:Request>
</req:Query>

Команда выполняет SQL-предложение SELECT

  • имя_соединения - параметр, указывающий имя соединения с СУБД, определенное в настройках приложения. Если этот параметр не указан, подразумевается, что Вы указали логин и пароль соединения с СУБД при помощи атрибутов login и password.
Команда может работать в двух режимах:
  1. Штатный режим. Описывается ниже.
  2. Режим глобальной XML-переменной, включаемый при указании для req:Query атрибута number с присвоением ему порядкового значения. При этом результат команды (SQL-запроса) помещается в специальную XML-переменную, к частям которой можно получить доступ при помощи команд второго прохода res:GlobalValue и res:Cycle. Внимание: данный режим работает только в случае, когда элемент команды является прямым потомком элемента root.

Данные (поля таблиц), возвращаемые SQL-запросом, могут быть следующего типа: NUMBER, DATE, VARCHAR2, LONG, CLOB. К каждому полю можно получить доступ по его имени при помощи команд второго прохода либо макросов. Имена всех полей должны писаться большими буквами, как это принято в Oracle. Имейте в виду, что для макросов (вида ##имя_поля##) возвращаются данные только из последней строки результата!

Дополнительными командами второго прохода являются res:RowNum и res:RowCount, первая возвращает номер строки результата, вторая - количество строк в результате.

Дополнительные подробности см. req:Call

Пример:

Таблица:

  CREATE TABLE web_test
    (ID  NUMBER,
    NAME VARCHAR2(30));
  INSERT INTO web_test
       VALUES (1, 'row1');
  INSERT INTO web_test
       VALUES (2, 'row2');
  INSERT INTO web_test
       VALUES (3, 'row3');

Код:

<table border="1">
<Execute>
  <req:Query connection="docsDB">
    <req:Request>
      select id, name from web_test order by id
    </req:Request>
  </req:Query>
  <Result>
    <tr>
      <td>
        <res:RowNum/>
      </td>
      <td>
        <res:ID/>
      </td>
      <td>
        <res:NAME/>
      </td>
    </tr>
  </Result>
</Execute>
</table>

Результат:

Команда также может работать с древовидными запросами. При этом для нее вводятся 3 дополнительных параметра:

  • id="ИдентификаторЗаписи"
    где ИдентификаторЗаписи является именем поля, идентифицирующим текущую запись.
  • parent_id="ИдентификаторРодительскойЗаписи"
    где ИдентификаторРодительскойЗаписи является именем полем, идентифицирующим родительскую запись.
  • root="ИдентификаторПервойЗаписи"
    где ИдентификаторПервойЗаписи является значением поля, с которого строится дерево (корень).

Если дерево необходимо отображать с возможностью сворачивания ветвей, внутрь элемента Result надо включить следующую конструкцию:

<div class="treeDiv" id="treeDiv^res:ID^">
  <script>
    printPlus(<res:ID/>);
  </script>
  ...
  <res:NextRow/>
</div>
где ID должно быть заменено на имя поля текущей записи. Команда res:NextRow дает команду вставить элементы-потомки в данное место (может применяться также при простом древовидном отображении без возможности сворачивания ветвей). Этим обеспечивается вложенность блоков.

Пример:

Таблица:

  CREATE TABLE web_test_tree
    (ID       NUMBER,
    parent_id NUMBER,
    NAME      VARCHAR2(30));
  INSERT INTO web_test_tree
       VALUES (1, NULL, 'root');
  INSERT INTO web_test_tree
       VALUES (2, 1, 'row1');
  INSERT INTO web_test_tree
       VALUES (3, 2, 'row2');
  INSERT INTO web_test_tree
       VALUES (4, 1, 'row2');

Код:

<Execute>
  <req:Query connection="docsDB" id="ID" parent_id="PARENT_ID" root="1">
    <req:Request>
      select * from web_test_tree
        connect by prior id = parent_id
        start with id = 1
    </req:Request>
  </req:Query>
  <Result>
    <div class="treeDiv" id="treeDiv^res:ID^">
      <script>
        printPlus(<res:ID/>);
      </script>
      <i><res:ID/></i> - 
      <res:NAME/>
      <res:NextRow/>
    </div>
  </Result>
</Execute>

Результат:


Иногда возникает необходимость сделать дополнительный запрос к данным полученных записей. Для этой цели предназначен атрибут subProcedure, значение которого должно быть именем вызываемой хранимой процедуры. Если соединение для этой процедуры отличается от основного соединения, его имя можно указать в необязательном атрибуте subConnection. Для подстановки в вызванную процедуру значений полей из полученной записи служит макрос, ограниченный символами !!. Для прохода по результатам подзапроса служит элемент SubResult, который должен быть заключен внутри элемента Result. Правила использования элемента SubResult аналогичны правилам использования элемента Result. При этом команды вывода результатов команд первого прохода могут возвращать не только результаты подзапроса, но и результаты самого запроса, если, конечно, имена полей не перекрываются.

Для того, чтобы изнутри элемента SubResult получить номер записи результата исходного запроса (а не вложенного запроса), используется команда res:SuperRowNum.

Пример:

<table border="1">
<Execute>
  <req:Query connection="glossaryDB"
    subProcedure="dic.search_element('TEST',!!MID!!,null,null,null,null,?)">
    <req:Request>
      select id mid, title from test where groups is null
        order by title
    </req:Request>
  </req:Query>
  <Result>
    <tr>
      <td style="vertical-align: top">
        <res:TITLE/>
      </td>
      <td>
        <ul>
          <SubResult>
            <li>
              <res:SuperRowNum/> - <res:RowNum/><br/>
              <res:TITLE/><br/>
              <input type="test" value="^res:MID^"/>
            </li>
          </SubResult>
        </ul>
      </td>
    </tr>
  </Result>
</Execute>
</table>

Результат:

comments
    qweqew
    • 2 - 1
      qwe1
    • 2 - 2
      qwe2
    • 2 - 3
      qwe3
    • 2 - 4
      qwe4
    АЫФАФЫАЫВАЫВА
    • 3 - 1
      11111111111111
    • 3 - 2
      3333322222211111
    Основние к зачислению
    • 4 - 1
      новый
    • 4 - 2
      по общему конкурсу
    тестовый раздел
      форум
      сообщить об ошибке Центр Новых Информационных Технологий