我正在尝试调用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)
调用Oracle
using 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
实际上是随机的......