Возможны ли пространственные запросы с использованием Python и cx_ Oracle? - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь выполнить пространственный запрос к пространственной таблице Oracle с помощью python с помощью пакета cx_ Oracle.

Я могу успешно выполнить обобщенные c запросы, но когда я пытаюсь пространственный запрос приводит к ошибкам.

Это то, что я пробовал:

import cx_Oracle
...

lon = -120.494352
lat = 36.585289

# open a connection to oracle
con = cx_Oracle.connect('myuser/mypass@spatialdb')

# create a cursor
cur = con.cursor()

# Create and populate Oracle objects
typeObj = con.gettype("MDSYS.SDO_GEOMETRY")
elementInfoTypeObj = con.gettype("MDSYS.SDO_ELEM_INFO_ARRAY")
ordinateTypeObj = con.gettype("MDSYS.SDO_ORDINATE_ARRAY")
obj = typeObj.newobject()
obj.SDO_GTYPE = 2001
obj.SDO_SRID = 8307
obj.SDO_ELEM_INFO = elementInfoTypeObj.newobject()
obj.SDO_ELEM_INFO.extend([1, 1, 1])
obj.SDO_ORDINATES = ordinateTypeObj.newobject()
obj.SDO_ORDINATES.extend([lon, lat])
print("Created object", obj)

# set up a distance-calculating sql statement
sql = "select id into :id from spatialtbl s where sdo_nn(s.geometry, :obj, 'sdo_num_res=1', 1) = 'TRUE'"

try:
    # execute the distance sql
    cur.execute(sql, id=id, obj=obj)
    print(f'The id is {id.getvalue()}')
except cx_Oracle.Error as error:
    print(error)

, что приводит к ошибке:

ORA-01036: illegal variable name/number

Может кто-нибудь сказать мне, что Возможно, я неправильно выполняю код или если пространственные запросы возможны даже с использованием Python и cx_ Oracle? Насколько я могу судить, в документации по cx_ Oracle это конкретно не рассматривается.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

В документации есть краткое упоминание:

Вот два примера из источника cx_ Oracle хранилище кодов:

Вот презентация недавней Oracle конференции:

В вашем примере вам, вероятно, нужно сделать как минимум id = cursor.var(int), см. Направление связывания , так что cx_ Oracle знает, что делать со значением, которое вы получаете из БД.

0 голосов
/ 20 февраля 2020

Я думаю, что проблема была в "select into" (зарезервировано для pl / sql?).

С помощью следующих действий я смог получить ответ:

# set up a distance-calculating sql statement
sql = """select id from spatialtbl s where sdo_nn(s.geometry, :ob, 'sdo_num_res=1', 1) = 'TRUE'"""

try:
    # execute the distance sql
    cur.execute(sql, ob=obj)
    id = cur.fetchone()
    print(f'The id is {id}')
except cx_Oracle.Error as error:
    print(error)
...