Oracle Embedded SQL (Pro*C/C++), вопрос.
Алсо интернет полон совершенно потрясающими в некотором смысле реализациями select from split(string я на это всё посмотрел и ажно заколдобился!
Ммм, моя проблема была в том, что список фигни (или строка его содержащая) становится известен проге в рантайме. То есть как я понял предлагаемое тобой решение, я бы мог в рантайме скомпилить такую stored procedure из строки, но потом селектить чисто эмбедднутыми стейтментами. Ну, просто компилить стейтмент как-то проще, наверное быстрее и работает в том числе на более старых ораклах.
А если на стороне клиента склеить рекордсет из строки?
И записать в какую-нибудь временную таблицу? Это как-то ещё тупее. А, а прямо на месте оно как бы не работает, потому что у этой фигни интересные отношения с массивами — оно тупо выполняет весь SQL стейтмент для каждого элемента как я понял и как удалось проверить на практике. То есть даёшь ей select bla from bla where bla not in (:array) с десятью элементами, а оно и выполнится десять раз, подставляя по одному элементу из массива. Поэтому например все участвующие в этом массивы должны быть одинаковой длины. Не знаю, может, для вложенных селектов всё не так, конечно, что-то я не подумал тогда это проверить, но сомневаюсь.
create type test_t as table of number;
select * from obj$ where obj# not member of test_t(1,2,3);
Но по моему динамический sql как-то понятней будет.
UPD: Чуть улучшил запрос.
Оставить комментарий
bleyman
Вдруг кто общался с этой штукой: можно ли там как-нибудь няшненько заюзать "WHERE something NOT IN (:list_of_stuff)" без использования динамического запроса?