Перечень статей   Терминология   Choose language


Ввод и вывод данных


Формат входных и выходных данных

SQL4 сам устанавливает HTTP-соединение. Входными данными является XML-текст (с тем послаблением, что если xml-элемент не имеет вложенных элементов, то он может не иметь знака слэш перед закрывающей угловой скобкой), выходными данными является XML-текст. Клиент извлекает картинку из базы данных по ее URL и отдельно от XML-данных.

Ввод данных

Действия при появлении данных

Получив входные данные, СУБД выполняет следующие действия:

Как xml-дерево записывается в базу данных

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

ввод в СУБД DDL введено
<formdata>
  <a        data=12.3>
    <b      data=23.4>
    <b      data=34.5>
    <b      data=45.6>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  data float
);
create table b (
  id   num      primary key,
  ref  num      references a(id),
  data float
);
insert into formdata values (1);
insert into a        values (10,   1, 12.3);
insert into b        values (101, 10, 23.4);
insert into b        values (102, 10, 34.5);
insert into b        values (103, 10, 45.6);

-- секция "b" является множеством
<formdata>
  <a        data=12.3>
    <b      data=23.4>
    <b      data=34.5>
    <b      data=45.6>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  data float
);
create table b (
  id   num      primary key,
  ref1 num      references a(id),
  ref2 num      references a(id),
  data float
);
insert into formdata values (1);
insert into a        values (10,   1, 12.3);
<formdata>
  <a/ref1   data=12.3>
    <b      data=23.4>
    <b      data=34.5>
    <b      data=45.6>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  data float
);
create table b (
  id   num      primary key,
  ref1 num      references a(id),
  ref2 num      references a(id),
  data float
);
insert into formdata values (1);
insert into a        values (10,   1,       12.3);
insert into b        values (101, 10, null, 23.4);
insert into b        values (102, 10, null, 34.5);
insert into b        values (103, 10, null, 45.6);


<formdata>
  <a        data=12.3>
    <b      data=23.4>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  ref  num      references b(id),
  data float
);
create table b (
  id   num      primary key,
  data float
);
insert into formdata values (1);
insert into a        values (10,  1, 100, 12.3);
insert into b        values (100,         23.4);

-- секция "b" является эстафетой
<formdata>
  <a        data=12.3>
    <b      data=23.4>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  ref1 num      references b(id),
  ref2 num      references b(id),
  data float
);
create table b (
  id   num      primary key,
  data float
);
insert into formdata values (1);
insert into a        values (10,  1, null, null, 12.3);
<formdata>
  <a        data=12.3>
    <b/ref1 data=23.4>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  ref1 num      references b(id),
  ref2 num      references b(id),
  data float
);
create table b (
  id   num      primary key,
  data float
);
insert into formdata values (1);
insert into a        values (10,  1, 100, null, 12.3);
insert into b        values (100,               23.4);
<formdata>
  <a        data=12.3>
    <b      data=23.4>
    <b      data=34.5>
    <b      data=45.6>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  ref  num      references b(id),
  data float
);
create table b (
  id   num      primary key,
  data float
);
insert into formdata values (1);
insert into a        values (10, 1, null, 12.3);

-- секция "b" не введена (все теги вместе!),
-- т.к. схема базы не содержит
-- ни множества, ни списка для нее


<formdata>
  <a        data=12.3>
    <b      data=23.4>
    <b      data=34.5>
    <b      data=45.6>
  </a>
</formdata>
create table a (
  id   num      primary key,
  srv  num      references formdata,
  ref  num      references b(id),
  data float
);
create table b (
  id   num      primary key,
  ref  num      references b(id),
  data float
);
insert into formdata values (1);
insert into a        values (10,  1, 101, 12.3);
insert into b        values (101,    102, 23.4);
insert into b        values (102,    103, 34.5);
insert into b        values (103,   null, 45.6);

-- секция "b" является списком

Вывод данных

Сокрытие записей и полей

Для предотвращения вывода некоторых таблиц и полей перед их именами нужно поставить знак "#".

a[data10.1].#b.c[#data] ;
<a   id=1   data=10.1>
  <c id=100 />
  <c id=101 />
  <c id=200 />
  <c id=201 />
  <c id=200 />
</a>
Для предотвращения вывода всех полей за исключением нескольких нужных надо поставить знак "#" перед скобками поля, а в самих скобках перечислить выводимые поля (поля выводятся в порядке перечисления).
a[data10.1].#b.c#[id] ;
<a   id=1   data=10.1>
  <c id=100 />
  <c id=101 />
  <c id=200 />
  <c id=201 />
  <c id=200 />
</a>

Сортировка записей

Если звено является списком, то вывод его элементов (записей) можно упорядочить по возрастанию или убыванию значений некоторых полей. Для этого перед именами этих полей нужно поставить целое число и знак "§" (будем называть это число фактором, factor. Фактор не может быть равен нулю). Поля будут использованы для сортировки в той последовательности, в какой возрастают модули их факторов. Положительный фактор означает сортировку по возрастанию, отрицательный - по убыванию. Таким образом TML-выражение

m[30§m1  10§m2  -20§m3]
эквивалентно DML-выражению
order by m2 asc, m3 desc, m1 asc
Вывод преобразуется так:
a.b.c ;
<a     id=1   data=12.3>
  <b   id=10  data=23.4>
    <c id=100 data=56.7/>
    <c id=101 data=67.8/>
  </b>
  <b   id=20  data=34.5>
    <c id=200 data=78.9/>
    <c id=201 data=89.1/>
  </b>
  <b   id=30  data=45.6>
    <c id=200 data=91.2/>
  </b>
</a>
a.b[-1§data].c[-1§data] ;
<a     id=1   data=12.3>
  <b   id=30  data=45.6>
    <c id=200 data=91.2/>
  </b>
  <b   id=20  data=34.5>
    <c id=201 data=89.1/>
    <c id=200 data=78.9/>
  </b>
  <b   id=10  data=23.4>
    <c id=101 data=67.8/>
    <c id=100 data=56.7/>
  </b>
</a>

Стартировка записей

Можно запросить не все неотсортированные записи, а только начинающиеся с какой-то определенной записи, для которой нам известны значения всех ее полей. Для этого перед именами всех полей нужно поставить знак "§", а после них знак "=" и значение поля. Таким образом TML-выражение

m[§m1=100 §m2=null §m3='string']
эквивалентно
DML-выражению
start by m1=100 m2=null m3='string'

Можно запросить не все отсортированные записи, а только начинающиеся с какой-то определенной записи - для этого надо одновременно применить сортировку и стартировку. Таким образом TML-выражение

m[30§m1=100 10§m2=null -20§m3='string']
эквивалентно DML-выражению
order by m2 asc, m3 desc, m1 asc
start by m1=100 m2=null m3='string'

Вывод картинки

Значением поля базы данных может быть картинка, но по TML-запросу как значение поля отправляется не она, а ее URL для отдельного HTTP-запроса браузера. В HTML4 браузер сможет использовать этот атрибут (поле) только если его имя есть "src" и он находится в теге (таблице) "IMG". В HTML5 браузер может использовать его в атрибуте "src" любого тега, если последний имеет свойство "display: img".

x ;
<x id="10"
   data1="Larry"
   data2="http://distination.org/?file_id=6382503452">

Вывод произвольного текста

Вывести можно произвольный текст

'<?xml-stylesheet type="text/xsl" href="a.xsl"?>' ;
<?xml-stylesheet type="text/xsl" href="a.xsl"?>
'text' ;
text
'<anytag>' ;
<anytag>
'</anytag>' ;
</anytag>
и данные базы данных: если выражение, осуществляющее вывод, изменяет значения полей, то эти новые значения не записываются в базу данных, а существуют только в отправляемых данных; ссылающиеся поля, использованные в запросе, в xml-текст не выводятся.
a[data10.1].b.c ;
<a     id=1   data=10.1>
  <b   id=10  data=23.4>
    <c id=100 data=56.7/>
    <c id=101 data=67.8/>
  </b>
  <b   id=20  data=34.5>
    <c id=200 data=78.9/>
    <c id=201 data=89.1/>
  </b>
  <b   id=30  data=45.6>
    <c id=200 data=91.2/>
  </b>
</a>

Изменение адреса получателя

Данные отправляются тому адресату, который в момент отправки указан в полях ral и ru таблицы sys. При старте триггера таблицы 'formdata' эти значения указывают на браузер, приславший запрос, но их в любой момент можно изменить (таким образом база данных сама может сделать запрос в другие базы данных для формирования ответа браузеру).

Для того, чтобы задублировать дерево в базе данных, нужно отправить его самому себе - для этого ran=0.



Тюрин Дмитрий



Перечень статей   Терминология   Choose language


Сайт управляется системой uCoz