|
ASA11 веб-сервис возвращает только 1-ю колонку select-а
|
|||
---|---|---|---|
#18+
Добрый день! Никак не пойму, в чем проблема. Есть веб-сервис, который возвращает результаты запроса в виде JSON. Веб-сервис вызывает хранимую процедуру: Код: plaintext
Эта процедура выполняет динамический селект: Код: plaintext 1.
В этом случае веб-сервис почему-то возвращает только первую колонку результата. Если выполнить внутри процедуры статический запрос, возвращаются все колонки: Код: plaintext
При вызове хранимой процедуры из interactive sql всегда возвращается правильное число колонок. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2011, 08:38 |
|
ASA11 веб-сервис возвращает только 1-ю колонку select-а
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2011, 17:37 |
|
ASA11 веб-сервис возвращает только 1-ю колонку select-а
|
|||
---|---|---|---|
#18+
Марсель, большое спасибо за помощь. Все заработало. Как я понял, сначала искуственно создают статический запрос, который по составу полей совпадает с основным динамическим запросом, но по условию оператора if и по условию запроса никогда не выполняется: Код: plaintext 1. 2. 3.
При трансляции хранимой процедуры ее result set получает структуру статического запроса. А потом выполняется основной динамический запрос, который возвращает нужные данные из процедуры: Код: plaintext 1.
Остается открытым вопрос: необходимость статического запроса - это баг ASA11 или это какая-то недокументированная особенность реализации веб-сервисов? Моя практическая задача несколько выходит за рамки этого примера. Мне нужно разработать веб-сервис, который будет принимать в качестве входных параметров имя таблицы, условия фильтрации данных, порядок сортировки, а возвращать - результат выполнения динамического select-а в виде JSON. При этом заранее неизвестна структура result set-а, возвращаемого веб-сервисом. Можно предложить компромиссный вариант решения: на каждую таблицу создать свой веб-сервис, в котором предварительно вызывать статический невыполнимый select со всеми атрибутами (select * from table). А затем формировать динамический select с нужными условиями и порядком сортировки. А все-таки, нельзя ли найти какое-то универсальное решение для всех таблиц в одном веб-сервисе? Еще раз огромное спасибо Марселю за помощь и оригинальное решение проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2011, 21:05 |
|
ASA11 веб-сервис возвращает только 1-ю колонку select-а
|
|||
---|---|---|---|
#18+
Есть еще один вариант "универсального" решения, правда не совсем корректный с точки зрения безопасности. Создаем веб-сервис с отсутствующим телом запроса. CREATE SERVICE service-name TYPE { 'RAW' | 'HTML' | 'JSON'| 'XML' } [ URL [ PATH ] { ON | OFF | ELEMENTS } ] [ common-attributes ] [ AS { statement | NULL } ] If the statement is NULL, the URL must specify the statement to be executed. Otherwise, the specified SQL statement is the only one that can be executed through the service. SOAP services must have statements; DISH services must have none. The default value is NULL. It is strongly recommended that all services run in production systems define a statement. The statement can be NULL only if authorization is enabled. Согласно теории такой сервис выполняет запрос, который передается ему в строке http-вызова: Код: plaintext
Браузер (или скрипт, выполняющий http-запрос) преобразует эту строку к виду: Код: plaintext
Веб-сервис ASA11, названный bpm_sel, с пустым телом запроса принимает вызов, выполняет select-выражение и выдает корректный ответ с полным набором полей. Почему это происходит, не смотря на то, что sql-запрос фактически является динамическим , сформированным на стороне клиента, не понятно. Существенным недостатком этого решения является возможность "SQL-инъекции", то есть передачи в качестве sql-запроса несанкционированной команды (например, drop table). Снизить уровень опасности поможет настройка прав доступа. Модератор: куски из документации лучше смотрится в тегах quot а не src. И вообще, следи за длиной строки в SRC. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2011, 07:21 |
|
ASA11 веб-сервис возвращает только 1-ю колонку select-а
|
|||
---|---|---|---|
#18+
tur_agА все-таки, нельзя ли найти какое-то универсальное решение для всех таблиц в одном веб-сервисе? Попробуйте ради интереса вызывать ХП в веб сервисе не через CALL, а SELECT * FROM bpm_select(). Вдруг поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2011, 22:38 |
|
ASA11 веб-сервис возвращает только 1-ю колонку select-а
|
|||
---|---|---|---|
#18+
Не помогло. Возникает ошибка: -------------------- SQL error: bpm_select returned a result set with a different schema than expected В процедуре bpm_select, которая возвращает результат запроса Код: plaintext 1.
определилась следующая структура результирующего набора записей: ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2011, 20:01 |
|
|
start [/forum/topic.php?desktop=1&fid=55&tid=2010377]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 326ms |
total: | 467ms |
0 / 0 |