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

「PythonのMySQLのInsertが遅い」 大量のデータを挿入したい場合、Insertに時間がかかる。 しかし一括でInsertすることで時間短縮することができる。 今回はそのバルク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 で指定する。


KRSW

駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

役に立ったらシェアしてくれると励みになります。
If you felt this article is useful, please share.
にほんブログ村 IT技術ブログへ

-DB, Python
-,

Translate »
Social media & sharing icons powered by UltimatelySocial

Copyright© ITips , 2020 All Rights Reserved.