mirth connect использование executeUpdateAndGetGeneratedKeys с Oracle

Я использую Mirth Connect 3.5.0.8232. Я создал постоянное соединение с базой данных Oracle и использую его в своих исходных и целевых соединителях. Один из методов, который Mirth предоставляет для взаимодействия с базой данных, — это executeUpdateAndGetGeneratedKeys. Это было бы весьма полезно для операторов вставки, которые возвращали бы первичные ключи для вставленных строк.

Мой вопрос: как указать, КАКИЕ столбцы возвращать? Выполнение предоставленной функции работает, но возвращает ROWID в CachedRowSet, а это не то, что мне нужно.

Насколько я понял, какие столбцы возвращать, зависит от типа базы данных, и каждая база данных ведет себя по-разному. Меня интересует именно Oracle.

Спасибо.


person hello_earth    schedule 11.08.2017    source источник


Ответы (1)


Файл executeUpdateAndGetGeneratedKeys использует Statement.RETURN_GENERATED_KEYS, сигнализирующий драйверу о необходимости возврата автоматически сгенерированных ключей. Однако из документов Oracle:

Если ключевые столбцы не указаны явно, то драйверы JDBC Oracle не смогут определить, какие столбцы необходимо извлечь. Когда используется имя столбца или массив индексов столбцов, драйверы JDBC Oracle могут определить, какие столбцы содержат автоматически сгенерированные ключи, которые вы хотите получить. Однако при использовании целочисленного флага Statement.RETURN_GENERATED_KEYS драйверы JDBC Oracle не могут идентифицировать эти столбцы. Когда целочисленный флаг используется для указания того, что должны быть возвращены автоматически сгенерированные ключи, в качестве ключа возвращается псевдостолбец 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();
    }
}
person Nick Rupley    schedule 11.08.2017
comment
спасибо, Ник - тоже спасибо за код - я также видел, что getGeneratedKeys иногда может вызывать исключение неподдерживаемого действия (или что-то в этом роде). - person hello_earth; 12.08.2017