Как решить ORA-01704: ошибка слишком длинного строкового литерала в Python cx_oracle? - PullRequest
2 голосов
/ 24 декабря 2011

Я пытаюсь обновить запись в таблице, используя Python cx_oracle. Столбец называется «шаблон» и имеет тип данных 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 символов. Как мне это решить?

Edit:

Я нашел это: 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: ошибка недопустимого символа.

Ответы [ 3 ]

4 голосов
/ 24 декабря 2011

Вставка значений в операторы 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()
0 голосов
/ 13 октября 2015

Используйте 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()
0 голосов
/ 24 декабря 2011

Измените определение таблицы. Поле varchar2 может хранить до 32767 байт; поэтому, если вы используете 8-битную кодировку, у вас остается немного места для игры, прежде чем прибегать к большим объектам.

...