2

タイプ""の列を持つOracleテーブルと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文字未満の場合はすべて正常に機能していますが、4000文字を超えるxmlを使用すると、次のエラーが発生します。

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

どうすればこれを処理できますか?Thx4の回答

4

3 に答える 3

5

XMLTypeに関するOracleドキュメントを確認してください

また、データ型はCLOB(Character Large Object)である必要があると思います。

于 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 に答える