Вставьте XML с более чем 4000 символов в столбец Oracle XMLTYPE - PullRequest
2 голосов
/ 24 марта 2010

У меня есть таблица оракула со столбцом типа "SYS.XMLTYPE" и процедура хранения, которая выполняет вставку:

(короткая версия):

PROCEDURE InsertXML 
(
     pXMLData IN LONG 
)
IS
BEGIN

    INSERT INTO MY_TABLE (XML_DATA) VALUES(pXMLData);

END InsertXML;

Я вызываю этот sp из моего кода C # с типом "OracleType.LongVarChar".

Теперь проблема: Если xml содержит менее 4000 символов, все работает нормально, но при использовании xml с более чем 4000 символов я получаю следующую ошибку:

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

Как я могу справиться с этим? Thx 4 ответа

Ответы [ 3 ]

5 голосов
/ 24 марта 2010

Проверьте документы Oracle о XMLType

Кроме того, я считаю, что тип данных должен быть CLOB (крупный объект персонажа).

0 голосов
/ 19 января 2018

Согласно Стюарт Кэмпбелл

  • Я вставил XMLTYPE в CLOB
  • но само заявление должно было быть включено в транзакцию.

Без транзакции не сработало ....

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

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

Среда: jpa 2.1.0, eclipselink 2.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();
...