通过Python中的JayDeBeApi在Oracle 11.2.0上调用过程
我正在尝试在我的数据库上调用dbms_random.seed42,请参阅。我需要使用python和JayDeBeApi连接器。到目前为止,我只能执行select语句而没有问题。我不明白我做错了什么 JayDeBeApi似乎没有提供该方法,因此我无法使用它:通过Python中的JayDeBeApi在Oracle 11.2.0上调用过程,python,sql,oracle,ojdbc,jaydebeapi,Python,Sql,Oracle,Ojdbc,Jaydebeapi,我正在尝试在我的数据库上调用dbms_random.seed42,请参阅。我需要使用python和JayDeBeApi连接器。到目前为止,我只能执行select语句而没有问题。我不明白我做错了什么 JayDeBeApi似乎没有提供该方法,因此我无法使用它: AttributeError: 'Cursor' object has no attribute 'callproc' 我天真地尝试过: conn = jaydebeapi.connect('oracle.jdbc.driver.Oracl
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)
但这会导致:错误:ORA-00900:无效的SQL语句
我尝试了两种似乎语法正确的解决方案,但由于生成器不是确定性的,我认为它们实际上失败了:
使用开始/结束:
使用呼叫:
所以我的问题是:如何使用JayDeBeApi在Oracle上调用dbms_random.seed42?作为一个附带问题,我如何检查语句是否实际执行失败,是否未引发异常,以及的返回值是否未定义
更新:
事实上,种子初始化工作正常,因为结果正是我所期望的:
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脚本的倍数时,我得到了确定的结果
SELECT *
FROM (
SELECT *
FROM table
ORDER BY DBMS_RANDOM.RANDOM)
WHERE rownum < 21;
curs.close()
conn.close()
jpype.shutdownJVM()