2

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

(精简版):

PROCEDURE InsertXML 
(
     pXMLData IN LONG 
)
IS
BEGIN

    INSERT INTO MY_TABLE (XML_DATA) VALUES(pXMLData);

END InsertXML;

我从我的 C# 代码中调用这个 sp,类型为“ OracleType.LongVarChar”。

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

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

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

4

3 回答 3

5

查看有关XMLType的 Oracle 文档

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

于 2010-03-24T15:38:37.847 回答
0

您需要先将超过 4000 个字符的 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();
于 2016-12-09T21:08:03.280 回答
0

根据 斯图尔特坎贝尔

  • 我将 XMLTYPE 插入到 CLOB
  • 但是语句本身必须包含在事务中。

没有交易,它不起作用....

于 2018-01-19T08:47:55.503 回答