Python cx_Oracle - как связать массив с cursor.execute () - PullRequest
0 голосов
/ 22 февраля 2019

У меня следующий SQL

select * from my_table
where my_param in :params

Как связать список питонов или другой массив с выражением выполнения курсора cx_Oracle?

Это не работает

cursor.execute(my_sql, {'params': [1, 2, 3]}

1 Ответ

0 голосов
/ 31 июля 2019

После долгих поисков я нашел это решение наиболее элегантным для меня, чтобы передать список в оператор 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)
...