2015-10-16 1 views
0

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

ответ

0

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

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

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

Смежные вопросы