Oracle Embedded SQL (Pro*C/C++), вопрос.

bleyman

Вдруг кто общался с этой штукой: можно ли там как-нибудь няшненько заюзать "WHERE something NOT IN (:list_of_stuff)" без использования динамического запроса?

bleyman

Отвечаю сам себе: нет, видимо, нет.
Алсо интернет полон совершенно потрясающими в некотором смысле реализациями select from split(string я на это всё посмотрел и ажно заколдобился!

kill-still

если ты вместо :list_of_stuff хочешь вставить функцию, то на то есть конвейерные ф-ии:
http://www.oracle.com/technology/sample_code/tech/pl_sql/htd...
или ты именно строку хотел?

bleyman

Ммм, моя проблема была в том, что список фигни (или строка его содержащая) становится известен проге в рантайме. То есть как я понял предлагаемое тобой решение, я бы мог в рантайме скомпилить такую stored procedure из строки, но потом селектить чисто эмбедднутыми стейтментами. Ну, просто компилить стейтмент как-то проще, наверное быстрее и работает в том числе на более старых ораклах.

kill-still

А если на стороне клиента склеить рекордсет из строки?

bleyman

И записать в какую-нибудь временную таблицу? Это как-то ещё тупее. А, а прямо на месте оно как бы не работает, потому что у этой фигни интересные отношения с массивами — оно тупо выполняет весь SQL стейтмент для каждого элемента как я понял и как удалось проверить на практике. То есть даёшь ей select bla from bla where bla not in (:array) с десятью элементами, а оно и выполнится десять раз, подставляя по одному элементу из массива. Поэтому например все участвующие в этом массивы должны быть одинаковой длины. Не знаю, может, для вложенных селектов всё не так, конечно, что-то я не подумал тогда это проверить, но сомневаюсь.

mbolik1

Можно попробовать с коллекциями извратиться вроде Pro*C/C++ их поддерживает.
 
create type test_t as table of number;

select * from obj$ where obj# not member of test_t(1,2,3);

Но по моему динамический sql как-то понятней будет.
UPD: Чуть улучшил запрос.
Оставить комментарий
Имя или ник:
Комментарий: