ORA-01461: может связывать значение LONG только для вставки в столбец LONG-Происходит при запросе - PullRequest
61 голосов
/ 06 февраля 2012

Когда я пытаюсь запросить объекты, я получаю следующую ошибку:

ORA-01461: can bind a LONG value only for insert into a LONG column

Может кто-нибудь помочь мне с объяснением причины и решения проблемы?

Ответы [ 15 ]

0 голосов
/ 21 февраля 2017

У меня была та же проблема с использованием PHP и подготовленные операторы для столбца VARCHAR2. Моя строка не превышала размер VARCHAR2. Проблема заключалась в том, что я использовал -1 как maxlength для привязки, но содержимое переменной изменилось позже.

Например:

$sMyVariable = '';
$rParsedQuery = oci_parse($rLink, 'INSERT INTO MyTable (MyVarChar2Column) VALUES (:MYPLACEHOLDER)');
oci_bind_by_name($rParsedQuery, ':MYPLACEHOLDER', $sMyVariable, -1, SQLT_CHR);

$sMyVariable = 'a';
oci_execute($rParsedQuery, OCI_DEFAULT);
$sMyVariable = 'b';
oci_execute($rParsedQuery, OCI_DEFAULT);

Если вы замените -1 на максимальную ширину столбца (т.е. 254), то этот код работает. С -1 oci_bind_by_param использует текущую длину содержимого переменной (в моем случае 0) в качестве максимальной длины для этого столбца. Это приводит к ORA-01461 при выполнении.

0 голосов
/ 10 декабря 2016

У меня есть решение для Java / JPA / eclipselink / oracle, когда вставьте длинную строку XML (> 4000) в столбец XMLTYPE в Вставьте XML с более чем 4000 символов в столбец Oracle XMLTYPE .Для ясности включите сюда то же самое содержимое, если ссылка не работает

Сначала необходимо преобразовать строку xml для более чем 4000 символов в тип SQLXML.

Среда: jpa 2.1.0, eclipselink2.5.2, oracle db 11gr2

SQL:

CREATE TABLE "XMLTEST"
( "ID" NUMBER(10,0) NOT NULL ENABLE, 
  "DESCRIPTION" VARCHAR2(50 CHAR) NOT NULL ENABLE, 
  "XML_TXT" "XMLTYPE" NOT NULL ENABLE
);

INSERT INTO XMLTEST (ID, DESCRIPTION, XML_TXT) VALUES (101, 'XML DATA', '<data>TEST</data>');
COMMIT;

DROP TABLE "XMLTEST";

Java-код

String sql = "INSERT INTO XMLTEST (ID, DESCRIPTION, XML_TXT) VALUES (?, ?, ?)";
String xmlDataStr = "<data>test...</data>"; // a long xml string with length > 4000 characters
Connection con = getEntityManager().unwrap(Connection.class);
SQLXML sqlXml = con.createSQLXML();
sqlXml.setString(xmlDataStr);

Java-код - используйте PreparedStatement

PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setLong(1, 201);
pstmt.setLong(2, "Long XML Data");
pstmt.setSQLXML(3, sqlXml);
pstmt.execute();

Javaкод - используйте собственный запрос вместо PreparedStatement

Query query = getEntityManager().createNativeQuery(sql);
query.setParameter(1, 301);
query.setParameter(2, "Long XML Data");
query.setParameter(3, sqlXml);
query.executeUpdate();
0 голосов
/ 19 августа 2016

Я столкнулся с этим сообщением об ошибке при попытке вставить строку в столбец XMLTYPE.

В частности, используя Java PreparedStatement, как это:

ps.setString('XML', document);

, где XML здесь определено как XMLTYPE.

0 голосов
/ 18 сентября 2014

Добавление другого варианта использования, где я обнаружил, что это происходит. Я использовал приложение ADF Fusion, и в качестве типа столбца использовался varchar2 (4000), который не мог вместить текст и, следовательно, эту ошибку.

0 голосов
/ 11 декабря 2013

Я столкнулся с той же проблемой при использовании Siebel REXPIMP (импорт реестра) при использовании последней версии драйвера Instant Client. Чтобы устранить проблемы, используйте предоставленный Siebel драйвер Data Direct. DLL это SEOR823.DLL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...