5

次のコードを使用して CLOB を挿入しようとしています。

cursor = connection.cursor()
cursor.setinputsizes(HERP = cx_Oracle.CLOB)

cursor.execute("INSERT INTO myTable (FOO, BAR) VALUES (:FOO, :BAR)", FOO=val1, BAR=val2)
cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=val3) 
#len(HERP) 39097

スクリプトを WITHOUT なしで実行するcursor.setinputsizes(HERP = cx_Oracle.CLOB)と、2 番目のクエリ WITHValueError: string data too largeで失敗し、スクリプトを実行するとcursor.setinputsizes(HERP = cx_Oracle.CLOB)、最初のクエリで失敗しますDatabaseError: ORA-01036: illegal variable name/number。挿入しようとしている CLOB にはコード スニペットが含まれています (つまり、セミコロン、コンマ、括弧がたくさんあります"string".decode("ascii")) u'string'。これらのいずれかに問題があるかどうかはわかりません。データベースのフィールドは現在 CLOB ですが、NCLOB で試してみましたが、動作は変わりませんでした。

また、フィールドをBLOBとして試してから、.encode("hex")挿入した値で使用しましたが、これも同じ動作です。

HERP = cursor.var(cx_Oracle.CLOB)代わりにcursor.setinputsizes(HERP = cx_Oracle.CLOB)、同じ問題も試しました。

私はcx-oracle-usersリストで議論を進めてきましたが、まだうまくいきません。

この行を使用すれば機能するcursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP="".join(set(val3)).encode("hex"))ので、データの内容に問題はないと思います (これは BLOB にあります)。

cx_OracleCLOB を Oracle データベースに挿入するにはどうすればよいですか?

4

1 に答える 1

5

いくつかの可能な解決策があります:

  1. cx_Oracleをアップグレードします。使用しているバージョンはわかりませんが、cx_Oracle5.1でpython2.7.2を使用しており、setinputsizesをまったく使用せずに150,000文字をCLOB列に挿入してもエラーは発生しません。
  2. setinputsizesは後続のすべてのカーソル使用に適用されるため、これらの異なるcursor.executeステートメント間で変更するだけです。

例えば:

cursor = connection.cursor()
cursor.setinputsizes(FOO=None, BAR=None)
cursor.execute("INSERT INTO myTable (FOO, BAR) VALUES (:FOO, :BAR)", 
FOO=val1,  BAR=val2)
cursor.setinputsizes(HERP = cx_Oracle.CLOB)
cursor.execute("INSERT INTO myTable2 (HERP) VALUES (:HERP)", HERP=val3)
于 2012-12-04T15:22:15.187 に答える