我想在我的数据库上拨打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
上致电JayDeBeApi
?作为一个附带问题,我如何检查语句实际上是否未能执行(没有抛出异常,并且execute的返回值未定义。)
更新
事实上,种子初始化正在按预期工作,因为结果是我所期望的:
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
实际上是随机的......
答案 0 :(得分:0)
经过多次试验和错误,我相信这只是一个副作用。因为我没有做清理通行证:
curs.close()
conn.close()
jpype.shutdownJVM()
查询会导致某些未定义的行为。现在我有一个正确的清理代码,当调用我的python脚本的倍数时,我得到确定性的结果。