为什么我使用JDBC插入一行数据时会出现ORA-01422错误?

huangapple 未分类评论48阅读模式
英文:

Why would I get ORA-01422 error while inserting a single row using JDBC

问题

我看到许多与此特定错误相关的问题,其中大部分与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 ;

我尝试了各种对象和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>

谢谢。

英文:

I see many related questions about this particular error - most of them having to do with SELECT INTO operations.

In this case though, I'm trying to insert a single row and don't find any answers to this particular issue.

I'm using the following code:

final String insertSQL = &quot;INSERT INTO XMLTYPETEST_XMLTYPE (ACTIVITYGUID, XMLDATA) VALUES (:1, XMLType(:2))&quot;;
final String guid = &quot;BFACFEB-8ACE-4145-B04A-759822E0AA7D&quot;;
final String xml = &quot;&lt;Activity&gt;&lt;Changes&gt;&lt;/Changes&gt;&lt;/Activity&gt;&quot;;
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();
}

The table XMLTYPETEST_XMLTYPE is defined as follows:



  CREATE TABLE &quot;PLAYGROUND&quot;.&quot;XMLTYPETEST_XMLTYPE&quot; 
   (	&quot;ACTIVITYGUID&quot; CHAR(36 BYTE), 
	&quot;XMLDATA&quot; &quot;XMLTYPE&quot;
   ) 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 &quot;USERS&quot; 
 XMLTYPE COLUMN &quot;XMLDATA&quot; STORE AS SECUREFILE BINARY XML (
  TABLESPACE &quot;USERS&quot; 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 

I've tried various combinations of objects and set*() methods for setting the XMLData parameter as well as using executeUpdate(), all with the same result:

ORA-01422: exact fetch returns more than requested number of rows

In case there's any clue in the library versions, here are the relevant dependencies:

&lt;dependency&gt;
    &lt;groupId&gt;com.oracle&lt;/groupId&gt;
    &lt;artifactId&gt;ojdbc8&lt;/artifactId&gt;
    &lt;version&gt;12.2.0.1&lt;/version&gt;
&lt;/dependency&gt;
&lt;!-- https://mvnrepository.com/artifact/oracle/xdb --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;oracle&lt;/groupId&gt;
    &lt;artifactId&gt;xdb&lt;/artifactId&gt;
    &lt;version&gt;1.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;!-- https://mvnrepository.com/artifact/com.oracle/xmlparserv2 --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.oracle.database.xml&lt;/groupId&gt;
    &lt;artifactId&gt;xmlparserv2&lt;/artifactId&gt;
    &lt;version&gt;19.3.0.0&lt;/version&gt;
&lt;/dependency&gt;

Thanks.

答案1

得分: 0

越是思考,越觉得不匹配的库版本可疑。我将两个库替换为以下版本:

``` lang-xml
        &lt;dependency&gt;
            &lt;groupId&gt;com.oracle.database.xml&lt;/groupId&gt;
            &lt;artifactId&gt;xmlparserv2&lt;/artifactId&gt;
            &lt;version&gt;12.2.0.1&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.oracle.database.xml&lt;/groupId&gt;
            &lt;artifactId&gt;xdb6&lt;/artifactId&gt;
            &lt;version&gt;12.2.0.1&lt;/version&gt;
        &lt;/dependency&gt;

问题得到解决。/捂脸


<details>
<summary>英文:</summary>

The more I thought about it, the more suspicious the mismatched library versions were.  I replaced two libraries with the following versions:

``` lang-xml
        &lt;dependency&gt;
            &lt;groupId&gt;com.oracle.database.xml&lt;/groupId&gt;
            &lt;artifactId&gt;xmlparserv2&lt;/artifactId&gt;
            &lt;version&gt;12.2.0.1&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.oracle.database.xml&lt;/groupId&gt;
            &lt;artifactId&gt;xdb6&lt;/artifactId&gt;
            &lt;version&gt;12.2.0.1&lt;/version&gt;
        &lt;/dependency&gt;

That fixed the problem. /facepalm

huangapple
  • 本文由 发表于 2020年4月9日 12:57:15
  • 转载请务必保留本文链接:https://java.coder-hub.com/61114261.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定