0

我正在尝试调用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)

所以我的问题是:我如何dbms_random.seed(42)调用Oracleusing JayDeBeApi?作为一个附带问题,我如何检查语句是否实际上未能执行(没有引发异常并且执行的返回值未定义。)

更新:

事实上,种子初始化正在按预期工作,因为结果是我所期望的:

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实际上是随机的......

4

1 回答 1

0

经过多次试验和错误,我相信这只是一个副作用。由于我没有进行清理通行证:

curs.close()
conn.close()
jpype.shutdownJVM()

该查询会导致一些未定义的行为。现在我有一个适当的清理代码,当我多次调用我的 python 脚本时,我得到了确定性的结果。

于 2015-10-19T07:21:26.330 回答