Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python和cx_Oracle是否可以进行空间查询?_Python_Cx Oracle_Nearest Neighbor_Sdo - Fatal编程技术网

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

使用Python和cx_Oracle是否可以进行空间查询?,python,cx-oracle,nearest-neighbor,sdo,Python,Cx Oracle,Nearest Neighbor,Sdo,我正在尝试使用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.

我正在尝试使用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文档并没有专门解决这个问题。

文档中有一个简短的提及:

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

以下是最近Oracle会议的演示:

  • 下载链接在那里,但可能不明显,也不清楚
在您的示例中,您可能至少需要执行
id=cursor.var(int)
,这样Oracle就知道如何处理从数据库中获取的值。

我认为“选择到”是问题所在(保留给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)

谢谢克里斯托弗,在你的链接让我再次思考之后,我找到了答案。谢谢你的回复!那会有帮助的!