在 Python 中通过 JayDeBeApi 在 Oracle 11.2.0 上调用过程
Call procedure on Oracle 11.2.0 via JayDeBeApi in Python
我正在尝试在我的数据库上调用 dbms_random.seed(42)
,请参阅 ref。我需要使用 python 和 JayDeBeApi
连接器。到目前为止,我只能毫无问题地执行 select
语句。我不明白我做错了什么。
好像JayDeBeApi
没有提供callproc方法,所以不能用:
AttributeError: 'Cursor' object has no attribute 'callproc'
我曾天真地尝试过:
conn = jaydebeapi.connect('oracle.jdbc.driver.OracleDriver',
['jdbc:oracle:thin:@server:1521/dbname', 'user', 'password'])
curs = conn.cursor()
sql="exec dbms_random.seed(42)"
curs.execute(sql)
但这会导致:Error: ORA-00900: invalid SQL statement
我已经尝试了两种似乎语法正确的解决方案,但由于生成器不是确定性的,我相信它们实际上失败了:
使用begin/end
:
sql="begin dbms_random.seed(42); end;"
curs.execute(sql)
使用call
:
sql="{ call dbms_random.seed(42) }"
curs.execute(sql)
所以我的问题是:如何使用 JayDeBeApi
在 Oracle
上调用 dbms_random.seed(42)
?作为附带问题,我如何检查语句是否实际执行失败(没有抛出异常并且 execute 的 return 值未定义。)
更新:
事实上,种子初始化按预期工作,因为结果符合我的预期:
sql="SELECT DBMS_RANDOM.value FROM dual"
curs.execute(sql)
data = curs.fetchall()
print(data)
但是我仍然看到我的随机查询选择有一些奇怪的行为:
SELECT *
FROM (
SELECT *
FROM table
ORDER BY DBMS_RANDOM.RANDOM)
WHERE rownum < 21;
出于某种原因,在后一种情况下,DBMS_RANDOM.RANDOM
实际上是随机的...
经过多次尝试和错误,我相信这只是一个副作用。因为我没有做清理通行证:
curs.close()
conn.close()
jpype.shutdownJVM()
查询会导致一些未定义的行为。现在我有了一个正确的清理代码,当多次调用我的 python 脚本时,我得到了确定性的结果。
我正在尝试在我的数据库上调用 dbms_random.seed(42)
,请参阅 ref。我需要使用 python 和 JayDeBeApi
连接器。到目前为止,我只能毫无问题地执行 select
语句。我不明白我做错了什么。
好像JayDeBeApi
没有提供callproc方法,所以不能用:
AttributeError: 'Cursor' object has no attribute 'callproc'
我曾天真地尝试过:
conn = jaydebeapi.connect('oracle.jdbc.driver.OracleDriver',
['jdbc:oracle:thin:@server:1521/dbname', 'user', 'password'])
curs = conn.cursor()
sql="exec dbms_random.seed(42)"
curs.execute(sql)
但这会导致:Error: ORA-00900: invalid SQL statement
我已经尝试了两种似乎语法正确的解决方案,但由于生成器不是确定性的,我相信它们实际上失败了:
使用begin/end
:
sql="begin dbms_random.seed(42); end;"
curs.execute(sql)
使用call
:
sql="{ call dbms_random.seed(42) }"
curs.execute(sql)
所以我的问题是:如何使用 JayDeBeApi
在 Oracle
上调用 dbms_random.seed(42)
?作为附带问题,我如何检查语句是否实际执行失败(没有抛出异常并且 execute 的 return 值未定义。)
更新:
事实上,种子初始化按预期工作,因为结果符合我的预期:
sql="SELECT DBMS_RANDOM.value FROM dual"
curs.execute(sql)
data = curs.fetchall()
print(data)
但是我仍然看到我的随机查询选择有一些奇怪的行为:
SELECT *
FROM (
SELECT *
FROM table
ORDER BY DBMS_RANDOM.RANDOM)
WHERE rownum < 21;
出于某种原因,在后一种情况下,DBMS_RANDOM.RANDOM
实际上是随机的...
经过多次尝试和错误,我相信这只是一个副作用。因为我没有做清理通行证:
curs.close()
conn.close()
jpype.shutdownJVM()
查询会导致一些未定义的行为。现在我有了一个正确的清理代码,当多次调用我的 python 脚本时,我得到了确定性的结果。