Я пытаюсь позвонить dbms_random.seed(42)
в свою БД, см. ref. Мне нужно использовать python и разъем JayDeBeApi
. Пока что я смог выполнить только select
заявление. Я не понимаю, что я делаю неправильно.Процедура вызова в Oracle 11.2.0 через JayDeBeApi в Python
Кажется, что 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 не определено.)
Update:
На самом деле инициализация семян работает, как ожидалось, поскольку результаты, что я рассчитывать на:
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
фактически является случайным ...