Вызов процедуры в Oracle 11.2.0 через JayDeBeApi в Python

Я пытаюсь позвонить dbms_random.seed(42) на моей БД см. исх. Мне нужно использовать 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? В качестве дополнительного вопроса, как я могу проверить, что оператор фактически не выполнил (исключение не было выдано, и возвращаемое значение для выполнения не определено).

Обновить:

Фактически начальная инициализация работает, как и ожидалось, поскольку я ожидаю получить следующие результаты:

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 ответ

Решение

После нескольких проб и ошибок, я считаю, что это просто побочный эффект. Так как я не делал очистки проход:

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

Запрос приведет к несколько неопределенному поведению. Теперь, когда у меня есть правильный код очистки, я получаю детерминированные результаты при вызове, умноженном на мой скрипт на Python.

Другие вопросы по тегам