我正在尝试使用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文档并没有具体说明这一点
我认为“SELECTINTO”是问题所在(保留给pl/sql?)
通过执行以下操作,我能够获得答案:
文件中简要提到:
以下是cx_Oracle源代码存储库中的两个示例:
以下是最近Oracle会议的演示:
在您的示例中,您可能至少需要执行
id = cursor.var(int)
,请参见Bind Direction,以便cx_Oracle知道如何处理从数据库中获得的值相关问题 更多 >
编程相关推荐