PythonでOracleに接続するライブラリ cx_oracle
。
それを使ってDBにinsertしようとすると、
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number
というエラーが発生することがある。
今回は ORA-01036
の発生する原因と対処法について紹介する。
原因
エラーメッセージには illegal variable name/number
と書いてある。
直訳すると 変数の名前または数字が正しくない
となる。
「変数って言われても色々変数あってわからないよ!」
とキレたくもなるが、プログラムの世界ではエラーメッセージを出してくれるのはまだ親切な方である。
この場合の変数とはSQLの中の変数なので、バインド変数のことを指しており、バインド変数の指定方法が間違っているのである。
対策
ではバインド変数のどこを直せばよいのか。
PyMySQLの場合と比較して説明する。
PyMySQLの場合、バインド変数の指定方法がいくつかあるが、そのひとつに %s
で指定していることがある。
# Bulk Insert def insert_data_bulk(values): print("Insert bulk data") insert_sql = "INSERT INTO test.hoge (name, value, text) values (%s,%s,%s)" cur = conn.cursor() cur.executemany(insert_sql, values)
-
PythonでMySQLに一括バルクInsert
このバインド変数の指定方法を cx_oracle では以下のように :1
, :2
, :3
で指定する。
# Bulk Insert def insert_data_bulk(values): print("Insert bulk data") insert_sql = "INSERT INTO test.hoge (name, value, text) values (:1,:2,:3)" cur = conn.cursor() cur.executemany(insert_sql, values)
するとバインド変数に起因するエラーは発生しなくなるはずだ。
まとめ
cx_Oracleで DatabaseError: ORA-01036
が発生する場合は、バインド変数の指定方法が間違っている可能性がある。
バインド変数は%s
ではなく :1
, :2
, :3
で指定する。