通过Python中的JayDeBeApi调用Oracle 11.2.0上的过程

时间:2015-10-16 09:22:11

标签: python sql oracle ojdbc jaydebeapi

我想在我的数据库上拨打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实际上是随机的......

1 个答案:

答案 0 :(得分:0)

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

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

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