Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Запрос с процедурой / 6 сообщений из 6, страница 1 из 1
20.01.2012, 15:33
    #37624294
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с процедурой
Есть таблица с геометрией (spatial datablade):
Код: sql
1.
2.
3.
4.
create table 'informix'.obj_polygon (
    obj_id INT not null,
    shape st_multipolygon
);


alter table 'informix'.obj_polygon add constraint primary key (obj_id) constraint xpkkl_amo2;
alter table 'informix'.obj_polygon add constraint foreign key (obj_id) references 'informix'.obj_base(id) constraint ref_obj_poligon;

В поле shape лежат полигоны (ST_POLIGON).
Требуется выдавать данные геометрии в виде хранящихся в ней точек (n,b,l).

Для превращения геометрии в координаты была написана процедура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE PROCEDURE "informix".retcoord(vobj_id INTEGER) RETURNING
	Integer,	--point_n
	FLOAT,		--b
	FLOAT;		--l

DEFINE	k_points	INT;
DEFINE	I		INT;
DEFINE	vline		ST_LineString;
DEFINE	vpoint		ST_POINT;

FOREACH SELECT
   st_exteriorring(ST_PolyFromKML(SE_AsKML(shape))) aa INTO vline FROM obj_polygon WHERE obj_id=vobj_id
   LET k_points=ST_NumPoints(vline);
   FOR i=1 TO k_points STEP 1
      LET vpoint=st_pointn(vline,i);
      RETURN i,ST_X(vpoint),ST_Y(vpoint) WITH RESUME;
   END FOR
END FOREACH

END PROCEDURE;



Но теперь я не могу ее присобачить в запросу или вьюхе: как только вместо константы ставлю поле, сразу выдаются ошибки,
иногда -999, иногда -217 (в зависимости от подставляемых таблиц и порядка полей в запросе). Сам запрос:

Код: sql
1.
2.
3.
SELECT obj_polygon.obj_id,t1.n,t1.b,t1.l 
FROM obj_polygon, TABLE(function retcoord(obj_polygon.obj_id)) AS t1(n,b,l) -- не работает
WHERE obj_polygon.obj_id=100041



Код: sql
1.
2.
3.
SELECT obj_polygon.obj_id,t1.n,t1.b,t1.l 
FROM obj_polygon, TABLE(function retcoord(100041)) AS t1(n,b,l) -- работает нормально
WHERE obj_polygon.obj_id=100041



Соответсвенно вопросы:
1) Как передать в процедуру в запросе не константу, а поле?
2) Нельзя ли преобразовывать мультиполигон в полигон более эффективно, чем это делаю я через строковое представление: ST_PolyFromKML(SE_AsKML(shape))?
...
Рейтинг: 0 / 0
20.01.2012, 16:48
    #37624451
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с процедурой
bk0010,
1. Уточни версию сервера :)
2. Если сразу привёл бы тексты ошибок к кодам, было бы неплохо - не у всех под рукой удобный справочник по ошибкам.
3.
дока тут
The collection expression cannot contain column references to tables that appear in the same FROM clause. That is, the collection-derived table must be independent of other tables in the FROM clause.
Что по-русски: TABLE(...) должна выдавать результат независимо от других частей FROM :(.
автор1) Как передать в процедуру в запросе не константу, а поле?

Получается, никак...

Навскидку выход (неудобный, но тем не менее): писать ХП, которая вернёт тебе нужную таблицу (obj_id,n,b,l) вместо твоего последнего SELECT...
...
Рейтинг: 0 / 0
20.01.2012, 23:09
    #37624868
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с процедурой
АнатоЛой1. Уточни версию сервера :)
2. Если сразу привёл бы тексты ошибок к кодам, было бы неплохо - не у всех под рукой удобный справочник по ошибкам.

Извините, писал с работы, спешил. Сервер - IDS 11.7, точнее пока не скажу - сервер не наш.
-999 - Not implemented yet.
-217 - Column column-name not found in any table in the query (or SLV is undefined).

АнатоЛой3. Навскидку выход (неудобный, но тем не менее): писать ХП, которая вернёт тебе нужную таблицу (obj_id,n,b,l) вместо твоего последнего SELECT...

А это не просадит сервер? Можно ли будет накладывать на таблицу условия?
...
Рейтинг: 0 / 0
21.01.2012, 01:54
    #37624985
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с процедурой
bk0010АнатоЛой3. Навскидку выход (неудобный, но тем не менее): писать ХП, которая вернёт тебе нужную таблицу (obj_id,n,b,l) вместо твоего последнего SELECT...

А это не просадит сервер? Можно ли будет накладывать на таблицу условия?
Мы друг-друга тут явно не поняли.
Есть:
1. Таблица мультиполигонов
2. Требование "выдавать по запросу (читай по произвольному заданному множеству мультиполигонов) сами точки мультиполигонов.

Варианты:
1) формировать в произвольном запросе на лету точки мультиполигона из самого мультиполигона через процедуру-таблицу. Уже попробовали - уткнулись в технические ограничения. Проблема: внутри одного select не получается в ХП передавать меняющийся идентификатор мультиполигона. Вывод: нужно избавиться от процедуры во FROM запроса или от "единого" селекта.

"избавиться от процедуры во FROM запроса":
2) предварительно формировать и хранить в отдельной таблице точки мультиполигонов, как только сохранили сам мультиполигон.
Получать запросом не напрягаясь с преобразованием, а просто объединяя таблицы. Минусы решения: нужно дополнительное место для хранения; возможно некоторые данные вообще не будут запрашиваться и зазря жрать место...

"избавиться от "единого" селекта":
3) формируем процедуру, которая выдаёт набор точек для произвольного набора мультиполигонов.
Вход: set как параметр или предварительно заполненная идентификаторами мультиполигонов временная таблица.
Выход процедуры: object_id, n, b, l, выдаваемый либо как
а) return ... with resume; (тогда с клиента EXECUTE PROCEDURE .... )
либо как б) временная таблица, наполненная ХП. (тогда с клиента SELECT * FROM tmp либо SELECT ... FROM tmp JOIN ... )

4) дожидаться реализации "-999 - Not implemented yet." %)
...
Рейтинг: 0 / 0
21.01.2012, 02:21
    #37624989
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с процедурой
АнатоЛой
Вход: set как параметр или предварительно заполненная идентификаторами мультиполигонов временная таблица.

содержат только те идентификаторы полигонов, которые интересуют пользователя.
Минус варианта 3: напрягаем регулярно процы...

5) возвращаем точки мультиполигона как одно поле и учим "клиента" самого разбираться с ними

6) добавляем к таблице obj_polygon поле exteriorring типа st_exteriorring, которое поддерживаем заполненным значениями ST_PolyFromKML(SE_AsKML(shape)).
Создаём табличку numbers (numb int) и заполняем её числами от 1 до скока_максимум_точек_может_быть_в_полигоне.
Запросы делаем типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT obj_polygon.obj_id
         , numbers.numb AS n 
         , ST_X(st_pointn( obj_polygon.exteriorring, numbers.numb)) AS b
         , ST_Y(st_pointn( obj_polygon.exteriorring, numbers.numb))  AS l 
         , ...
  FROM obj_polygon, numbers -- , и ещё чего надо
    WHERE obj_polygon.obj_id=100041 -- или чего ещё похуже
       AND numbers.numb <= ST_NumPoints(obj_polygon.exteriorring)



П.С.: ну вот вроде и пятница кончилась :)
...
Рейтинг: 0 / 0
21.01.2012, 22:39
    #37625431
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с процедурой
Спасибо, буду пробовать
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Запрос с процедурой / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]