1

我正在使用 Mirth Connect 3.5.0.8232。我创建了一个到 Oracle 数据库的持久连接,并在我的源连接器和目标连接器中使用它。Mirth 提供的与数据库对话的方法之一是executeUpdateAndGetGeneratedKeys。这对于返回插入行的主键的插入语句非常有用。

我的问题是 - 你如何指定要返回哪些列?运行提供的函数有效,但在 CachedRowSet 中返回 ROWID,这不是我想要的。

据我了解,返回哪些列取决于数据库的类型,并且每个数据库的行为都不同。我对甲骨文特别感兴趣。

谢谢你。

4

1 回答 1

1

executeUpdateAndGetGeneratedKeys方法使用Statement.RETURN_GENERATED_KEYS标志向驱动程序发出信号,表明应该返回自动生成的密钥。但是,来自Oracle 文档

如果未明确指出关键列,则 Oracle JDBC 驱动程序无法识别需要检索哪些列。当使用列名或列索引数组时,Oracle JDBC 驱动程序可以识别哪些列包含您要检索的自动生成的键。但是,当使用Statement.RETURN_GENERATED_KEYS整数标志时,Oracle JDBC 驱动程序无法识别这些列。当整数标志用于指示要返回自动生成的键时,ROWID伪列作为键返回。然后ROWID可以从 ResultSet 对象中获取 ,并可用于检索其他列。

因此,请尝试使用他们将列名数组传递给的建议prepareStatement

var dbConn;

try {
    dbConn = DatabaseConnectionFactory.createDatabaseConnection('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@localhost:1521:DBNAME','user','pass');

    // Create a Java String array directly
    var keyColumns = java.lang.reflect.Array.newInstance(java.lang.String, 1);
    keyColumns[0] = 'id';
    var ps = dbConn.getConnection().prepareStatement('INSERT INTO tablename (columnname) VALUES (?)', keyColumns);

    try {
        // Set variables here
        ps.setObject(1, 'test');
        ps.executeUpdate();

        var result = ps.getGeneratedKeys();
        result.next();
        var generatedKey = result.getObject(1);

        logger.info(generatedKey);
    } finally {
        ps.close();
    }
} finally {
    if (dbConn) {
        dbConn.close();
    }
}
于 2017-08-11T15:40:44.013 回答