Настройка перечислений PostgreSQL с использованием JDBC ResultSet - PullRequest
4 голосов
/ 24 декабря 2010

Я пытаюсь скопировать данные из базы данных MySQL в эквивалентную базу данных PostgreSQL, выполняю загрузку / вставку через Java с использованием JDBC.Я получаю эту ошибку всякий раз, когда пытаюсь скопировать столбец перечисления:

org.postgresql.util.PSQLException: ОШИБКА: столбец "mycol" имеет тип mytable_mycol_enum, но выражение имеет тип символов, меняющихся
Подсказка: вам нужно будет переписать или привести выражение.
Позиция: 194

Код Java (упрощенный и анонимный):

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection mysqlConn = DriverManager.getConnection(
    "jdbc:mysql://localhost/mysqldb", "user", "pass");
Class.forName("org.postgresql.Driver").newInstance();
Connection pgConn = DriverManager.getConnection(
    "jdbc:postgresql://othercomp/pgdb", "user", "pass");

Statement selStatement = mysqlConn.createStatement();
ResultSet selSet = selStatement.executeQuery("SELECT * FROM mytable");

Statement insStatement = pgConn.createStatement(
    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
Resultset insSet = insStatement.executeQuery("SELECT * FROM mytable WHERE 0=1");
insSet.moveToInsertRow();

while(selSet.next())
{
    ResultSetMetaData metaData = selSet.getMetaData();
    for (int i = 1; i <= metaData.getColumnCount(); i++)
    {
        String colName = metaData.getColumnName(i);
        Object obj = selSet.getObject(colName);
        insertSet.updateObject(colName, obj);
    }
    insertSet.insertRow();
}

Это прекрасно работает для таблицбез столбца enum, но

В MySQL у меня есть столбец mycol типа enum('A','B','C')

В PostgreSQL у меня есть mycol типа mytable_mycol_enum с CREATE TYPE mytable_mycol_enum AS ENUM ('A','B','C')

Как установить значение перечисления?

1 Ответ

6 голосов
/ 03 января 2011

Вы должны привести значение, чтобы postgresql его понял:

вставить в значения mytable (mycol) ('A' :: mytable_mycol_enum)

YouВозможно, придется использовать именованный оператор вставки, а не общий в вашем примере.Кроме того, попробуйте сначала в psql, чтобы увидеть, работает ли он.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...