在 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)

所以我的问题是:如何使用 JayDeBeApiOracle 上调用 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 脚本时,我得到了确定性的结果。