我试图在我的DB上调用dbms_random.seed(42),请参阅参考。我需要使用python和JayDeBeApi连接器。到目前为止,我只能在没有问题的情况下执行select语句。我不明白我做错了什么。
JayDeBeApi似乎没有提供愈伤组织方法,所以我不能使用它:
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?另一个问题是,如何检查语句是否实际执行失败(没有抛出异常,执行的返回值未定义)。
更新:
事实上,种子初始化工作如出一辙,因为我期望的结果是:
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实际上是随机的.
发布于 2015-10-19 07:21:26
经过多次尝试和错误,我相信这只是一个副作用。因为我没有做清理通行证:
curs.close()
conn.close()
jpype.shutdownJVM()查询将导致一些未定义的行为。现在我有了正确的清理代码,当调用倍数乘以我的python脚本时,我得到了确定性的结果。
https://stackoverflow.com/questions/33166788
复制相似问题