Процедура вызова в Oracle 11.2.0 через JayDeBeApi в Python

Я пытаюсь вызвать 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? В качестве побочного вопроса, как мне проверить, что оператор действительно не выполнился (исключение не было выдано и возвращаемое значение для выполнить не определен.)

Обновлять:

На самом деле инициализация начального числа работает, как и ожидалось, поскольку я ожидаю таких результатов:

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 на самом деле случайно...


person malat    schedule 16.10.2015    source источник


Ответы (1)


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

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

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

person malat    schedule 19.10.2015