3

Pythoncx_oracleを使用してテーブルのエントリを更新しようとしています。この列の名前は「template」で、データ型はCLOBです。

これは私のコードです:

dsn = cx_Oracle.makedsn(hostname, port, sid)
orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn)
curs = orcl.cursor()
sql = "update mytable set template='" + template + "' where id='6';"
curs.execute(sql)
orcl.close()

これを行うと、文字列リテラルが長すぎるというエラーが表示されます。テンプレート変数には約26000文字が含まれています。どうすればこれを解決できますか?

編集:

私はこれを見つけました:http://osdir.com/ml/python.db.cx-oracle/2005-04/msg00003.html
だから私はこれを試しました:

curs.setinputsizes(value = cx_Oracle.CLOB)
sql = "update mytable set template='values(:value)' where id='6';"
curs.execute(sql, value = template)

「ORA-01036:不正な変数名/番号エラー」が表示されます

Edit2:

これが私のコードです:

    curs.setinputsizes(template = cx_Oracle.CLOB)
    sql = "update mytable set template= :template where id='6';"
    print sql, template
    curs.execute(sql, template=template)

ORA-00911:無効な文字エラーが発生しました。

4

3 に答える 3

5

SQLステートメントに値を挿入することは非常に悪い習慣です。代わりにパラメータを使用する必要があります。

dsn = cx_Oracle.makedsn(hostname, port, sid)
orcl = cx_Oracle.connect(username + '/' + password + '@' + dsn)
curs = orcl.cursor()
curs.setinputsizes(template = cx_Oracle.CLOB)
sql = "update mytable set template= :template where id='6'"
curs.execute(sql, template=template)
orcl.close()
于 2011-12-23T20:33:50.710 に答える
0

IronPythonを使用する

import sys
sys.path.append(r"...\Oracle\odp.net.11g.64bit")
import clr
clr.AddReference("Oracle.DataAccess")
from Oracle.DataAccess.Client import OracleConnection, OracleCommand,   OracleDataAdapter

connection = OracleConnection('userid=user;password=hello;datasource=database_1')
connection.Open()

command = OracleCommand()
command.Connection = connection
command.CommandText = "SQL goes here"
command.ExecuteNonQuery()
于 2015-10-13T13:30:19.540 に答える
-1

テーブル定義を変更します。フィールドにvarchar2は最大32767バイトを格納できます。したがって、8ビットエンコーディングを使用している場合は、LOBに頼る前に少し余裕を持って遊ぶことができます。

于 2011-12-23T20:22:16.173 に答える