Я пытаюсь вызвать 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
на самом деле случайно...