使用Python和cx_Oracle是否可以进行空间查询?

问题描述 投票:1回答:2

我正在尝试使用cx_Oracle软件包通过python在Oracle空间表上执行空间查询。

我可以成功进行通用查询,但是当我尝试空间查询时会导致错误。

这是我尝试过的:

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文档没有专门解决此问题。

python cx-oracle nearest-neighbor sdo
2个回答
1
投票

文档中有简短的提及:

这是cx_Oracle源代码存储库中的两个示例:

这是最近一次Oracle会议的演讲:

在您的示例中,您可能至少需要执行id = cursor.var(int),请参阅Bind Direction,以便cx_Oracle知道如何处理从数据库中获取的值。


0
投票

我认为“选择进入”是问题所在(保留给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)
© www.soinside.com 2019 - 2024. All rights reserved.