Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA11 веб-сервис возвращает только 1-ю колонку select-а / 6 сообщений из 6, страница 1 из 1
18.03.2011, 08:38
    #37171368
tur_ag
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA11 веб-сервис возвращает только 1-ю колонку select-а
Добрый день! Никак не пойму, в чем проблема.

Есть веб-сервис, который возвращает результаты запроса в виде JSON. Веб-сервис вызывает хранимую процедуру:
Код: plaintext
call bpm_select()

Эта процедура выполняет динамический селект:

Код: plaintext
1.
    EXECUTE IMMEDIATE with result set on 'select * from bpm';

В этом случае веб-сервис почему-то возвращает только первую колонку результата.

Если выполнить внутри процедуры статический запрос, возвращаются все колонки:

Код: plaintext
select * from bpm;

При вызове хранимой процедуры из interactive sql всегда возвращается правильное число колонок.
...
Рейтинг: 0 / 0
18.03.2011, 17:37
    #37172685
Марсель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA11 веб-сервис возвращает только 1-ю колонку select-а
Код: plaintext
1.
2.
3.
4.
  if  1  =  0  then
    select * from bpm where  1 = 0 ;
  end if;
  EXECUTE IMMEDIATE with result set on 'select * from bpm';
...
Рейтинг: 0 / 0
18.03.2011, 21:05
    #37172958
tur_ag
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA11 веб-сервис возвращает только 1-ю колонку select-а
Марсель, большое спасибо за помощь. Все заработало.

Как я понял, сначала искуственно создают статический запрос, который по составу полей совпадает с основным динамическим запросом, но по условию оператора if и по условию запроса никогда не выполняется:

Код: plaintext
1.
2.
3.
if  1  =  0  then
    select * from bpm where  1 = 0 ;
end if;

При трансляции хранимой процедуры ее result set получает структуру статического запроса.

А потом выполняется основной динамический запрос, который возвращает нужные данные из процедуры:

Код: plaintext
1.
EXECUTE IMMEDIATE with result set on 'select * from bpm';

Остается открытым вопрос: необходимость статического запроса - это баг ASA11 или это какая-то недокументированная особенность реализации веб-сервисов?

Моя практическая задача несколько выходит за рамки этого примера. Мне нужно разработать веб-сервис, который будет принимать в качестве входных параметров имя таблицы, условия фильтрации данных, порядок сортировки, а возвращать - результат выполнения динамического select-а в виде JSON. При этом заранее неизвестна структура result set-а, возвращаемого веб-сервисом.

Можно предложить компромиссный вариант решения: на каждую таблицу создать свой веб-сервис, в котором предварительно вызывать статический невыполнимый select со всеми атрибутами (select * from table). А затем формировать динамический select с нужными условиями и порядком сортировки.

А все-таки, нельзя ли найти какое-то универсальное решение для всех таблиц в одном веб-сервисе?

Еще раз огромное спасибо Марселю за помощь и оригинальное решение проблемы.
...
Рейтинг: 0 / 0
19.03.2011, 07:21
    #37173289
tur_ag
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA11 веб-сервис возвращает только 1-ю колонку select-а
Есть еще один вариант "универсального" решения, правда не совсем корректный с точки зрения безопасности.

Создаем веб-сервис с отсутствующим телом запроса.

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://localhost/bp/bpm_sel?select * from bpm

Браузер (или скрипт, выполняющий http-запрос) преобразует эту строку к виду:

Код: plaintext
http://localhost/bp/bpm_sel?select% 20 *%20from%20bpm

Веб-сервис ASA11, названный bpm_sel, с пустым телом запроса принимает вызов, выполняет select-выражение и выдает корректный ответ с полным набором полей. Почему это происходит, не смотря на то, что sql-запрос фактически является динамическим , сформированным на стороне клиента, не понятно.

Существенным недостатком этого решения является возможность "SQL-инъекции", то есть передачи в качестве sql-запроса несанкционированной команды (например, drop table). Снизить уровень опасности поможет настройка прав доступа.

Модератор: куски из документации лучше смотрится в тегах quot а не src. И вообще, следи за длиной строки в SRC.
...
Рейтинг: 0 / 0
21.03.2011, 22:38
    #37176285
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA11 веб-сервис возвращает только 1-ю колонку select-а
tur_agА все-таки, нельзя ли найти какое-то универсальное решение для всех таблиц в одном веб-сервисе?
Попробуйте ради интереса вызывать ХП в веб сервисе не через CALL, а SELECT * FROM bpm_select(). Вдруг поможет.
...
Рейтинг: 0 / 0
23.03.2011, 20:01
    #37179939
tur_ag
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA11 веб-сервис возвращает только 1-ю колонку select-а
Не помогло. Возникает ошибка:

--------------------
SQL error: bpm_select returned a result set with a different schema than expected


В процедуре bpm_select, которая возвращает результат запроса

Код: plaintext
1.
select * from bpm;

определилась следующая структура результирующего набора записей:
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA11 веб-сервис возвращает только 1-ю колонку select-а / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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