После долгих поисков я нашел это решение наиболее элегантным для меня, чтобы передать список в оператор Oracle SQL.
Требуется, чтобы вы могли создавать новые типы в базе данных.
создать тип вложенной таблицы в базе данных
create type t_id_tab as table of number;
Обратите внимание, что в Oracle 11 это должно быть сделано на уровне схемы, а не в пакете.В противном случае наше утверждение (см. Следующий шаг) не будет работать.
скрипт python
С помощью cx_Oracle можно использовать объект api для создания нового объекта пользовательских типов.Этот объект может быть передан в запрос.
import cx_Oracle
db = cx_Oracle.connect("my_user", "my_password", "<host>:<port>/<sid>")
cursor = db.cursor()
id_list_type = db.gettype("t_id_tab")
id_list = id_list_type.newobject([1, 2, 3, 4])
cursor.execute("select * from my_table where my_param in (select column_value from table (:id_values))", id_values=id_list)
Непроверенная версия для oracle 12 и далее
Говорят, что начиная с oracle12 и далее тот же синтаксис sql, что иВыше работает также для ассоциативных массивов.Я не могу это проверить.Но если это правильно, это должно работать без создания пользовательского типа коллекции;
import cx_Oracle
db = cx_Oracle.connect("my_user", "my_password", "<host>:<port>/<sid>")
cursor = db.cursor()
id_list = cursor.arrayvar(cx_Oracle.NUMBER, [1, 2, 3, 4])
cursor.execute("select * from my_table where my_param in (select column_value from table (:id_values))", id_values=id_list)