
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 で指定する。



