DB Python

Python - cx_oracle で DatabaseError ora-01036 が発生してしまう

python cx_oracle DatabaseError ora-01036 illegal variable name number

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


ITipsと同じようなブログを作る方法

ブログに興味がありますか?

もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

ランキング参加中

にほんブログ村 IT技術ブログへ

他にもブログやSNSで紹介してくれると励みになります。

はてブのコメントで酷評されると泣きます(´;ω;`)

-DB, Python
-,

© 2024 ITips