|
Запрос с процедурой
|
|||
---|---|---|---|
#18+
Есть таблица с геометрией (spatial datablade): Код: sql 1. 2. 3. 4.
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.
Но теперь я не могу ее присобачить в запросу или вьюхе: как только вместо константы ставлю поле, сразу выдаются ошибки, иногда -999, иногда -217 (в зависимости от подставляемых таблиц и порядка полей в запросе). Сам запрос: Код: sql 1. 2. 3.
Код: sql 1. 2. 3.
Соответсвенно вопросы: 1) Как передать в процедуру в запросе не константу, а поле? 2) Нельзя ли преобразовывать мультиполигон в полигон более эффективно, чем это делаю я через строковое представление: ST_PolyFromKML(SE_AsKML(shape))? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2012, 15:33 |
|
Запрос с процедурой
|
|||
---|---|---|---|
#18+
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... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2012, 16:48 |
|
Запрос с процедурой
|
|||
---|---|---|---|
#18+
АнатоЛой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... А это не просадит сервер? Можно ли будет накладывать на таблицу условия? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2012, 23:09 |
|
Запрос с процедурой
|
|||
---|---|---|---|
#18+
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." %) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2012, 01:54 |
|
Запрос с процедурой
|
|||
---|---|---|---|
#18+
АнатоЛой Вход: 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.
П.С.: ну вот вроде и пятница кончилась :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2012, 02:21 |
|
|
start [/forum/topic.php?fid=44&msg=37624868&tid=1607207]: |
0ms |
get settings: |
11ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
28ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
135ms |
get tp. blocked users: |
0ms |
others: | 311ms |
total: | 499ms |
0 / 0 |