0

dbms_random.seed(42)DBを呼び出そうとしています。 refを参照してください。Python とJayDeBeApiコネクタを使用する必要があります。これまでのところselect、問題なくステートメントを実行することしかできませんでした。私は自分が間違っていることを理解できません。

callprocメソッドを提供してJayDeBeApiいないようで、使用できません。

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

構文が正しいと思われる2つのソリューションを試しましたが、ジェネレーターは決定論的ではないため、実際には失敗したと思います。

使用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)にはどうすればよいですか? 副次的な質問として、ステートメントが実際に実行に失敗したことを確認するにはどうすればよいですか (例外はスローされず、実行の戻り値は未定義です)。OracleJayDeBeApi

アップデート:

実際、結果は期待どおりであるため、シードの初期化は期待どおりに機能しています。

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実際にはランダムです...

4

1 に答える 1