Вызов процедуры в 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.