Почему я получаю ошибку ORA-01422 при вставке одной строки с использованием JDBC? - PullRequest
2 голосов
/ 09 апреля 2020

Я вижу много связанных вопросов об этой конкретной ошибке - большинство из них связано с SELECT INTO операциями.

В этом случае, однако, я пытаюсь вставить один грести и не найти ответов на этот конкретный вопрос.

Я использую следующий код:

final String insertSQL = "INSERT INTO XMLTYPETEST_XMLTYPE (ACTIVITYGUID, XMLDATA) VALUES (:1, XMLType(:2))";
final String guid = "BFACFEB-8ACE-4145-B04A-759822E0AA7D";
final String xml = "<Activity><Changes></Changes></Activity>";
try (OraclePreparedStatement stmt = 
        (OraclePreparedStatement) conn.prepareStatement(insertSQL)) {
    stmt.setString(1, guid);
    stmt.setString(2, xml);
    stmt.execute();

} catch (SQLException ex) {
    Logger.getLogger(DBConnectionTest.class.getName())
          .log(Level.SEVERE, null, ex);
    fail();
}

Таблица XMLTYPETEST_XMLTYPE определяется следующим образом:



  CREATE TABLE "PLAYGROUND"."XMLTYPETEST_XMLTYPE" 
   (    "ACTIVITYGUID" CHAR(36 BYTE), 
    "XMLDATA" "XMLTYPE"
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" 
 XMLTYPE COLUMN "XMLDATA" STORE AS SECUREFILE BINARY XML (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
  NOCACHE LOGGING  NOCOMPRESS  KEEP_DUPLICATES 
  STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ALLOW NONSCHEMA DISALLOW ANYSCHEMA ;


Name          Type           
------------  -------------- 
ACTIVITYGUID  CHAR(36)       
XMLDATA       PUBLIC.XMLTYPE 

Я пробовал различные комбинации объектов и set*() методы для установки параметра XMLData, а также использование executeUpdate(), все с одинаковым результатом:

ORA-01422: точное извлечение возвращает больше, чем запрошенное количество строк

В случае, если есть Любые подсказки в версиях библиотеки, вот соответствующие зависимости:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/oracle/xdb -->
<dependency>
    <groupId>oracle</groupId>
    <artifactId>xdb</artifactId>
    <version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle/xmlparserv2 -->
<dependency>
    <groupId>com.oracle.database.xml</groupId>
    <artifactId>xmlparserv2</artifactId>
    <version>19.3.0.0</version>
</dependency>

Спасибо.

1 Ответ

0 голосов
/ 09 апреля 2020

Чем больше я об этом думал, тем подозрительнее были несовпадающие версии библиотеки. Я заменил две библиотеки на следующие версии:

        <dependency>
            <groupId>com.oracle.database.xml</groupId>
            <artifactId>xmlparserv2</artifactId>
            <version>12.2.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.xml</groupId>
            <artifactId>xdb6</artifactId>
            <version>12.2.0.1</version>
        </dependency>

Это решило проблему. / Facepalm

...