将超过4000个字符的XML插入Oracle XMLTYPE列

时间:2010-03-24 15:33:51

标签: xml oracle insert ora-01461 ora-20000

我有一个带有“SYS.XMLTYPE”类型列的oracle表和一个正在执行插入的存储过程:

(简短版):

PROCEDURE InsertXML 
(
     pXMLData IN LONG 
)
IS
BEGIN

    INSERT INTO MY_TABLE (XML_DATA) VALUES(pXMLData);

END InsertXML;

我使用类型为“OracleType.LongVarChar”的C#代码调用此sp。

现在问题: 如果xml少于4000个字符,一切正常,但是通过使用超过4000个字符的xml,我收到以下错误:

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

我该如何处理? 答案4答案

3 个答案:

答案 0 :(得分:5)

查看有关XMLType

的Oracle文档

另外,我认为数据类型应该是CLOB(字符大对象)。

答案 1 :(得分:0)

首先需要将超过4000个charcater的xml字符串转换为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();

答案 2 :(得分:0)

根据 Stuart Campbell

  • 我将XMLTYPE插入CLOB
  • 但声明本身必须包含在交易中。

没有交易,它没有用......