Создание таблиц в базе данных Oracle с помощью JDBC - PullRequest
0 голосов
/ 28 февраля 2012

У меня проблема с созданием таблиц контроллером JDBC в базе данных Oracle. Когда я создаю таблицу с помощью "Creata Table ...." все в порядке. Создание таблицы, и я вижу эту таблицу от разработчика SQL. У меня есть метод, чтобы проверить, если таблица с таким именем существует - и она работает хорошо. Поэтому, когда я создаю таблицу (я тоже пытаюсь сделать коммит - не помогает), таблица появляется в SQL-разработчике, но когда я проверяю своим методом, существует ли эта таблица, я получаю «ложь» (не существует), когда я перезапускаю базу данных и запустите снова, мой метод вернет 'true'. Я думаю, что это проблема с сессией, но я не знаю, как покончить с этим.

enter code here public void prepStatExecuteCreateTable(String name){
        String createTable= "Create table "+ name +"  (ID NUMBER(*, 0) NOT NULL PRIMARY KEY, CZAS NUMBER(*, 0) NOT NULL, OTWARCIE   NUMBER(6, 2) NOT NULL , MAX_KURS   NUMBER(6, 2) NOT NULL , MIN_KURS   NUMBER(6, 2) NOT NULL , ZAMKNIECIE NUMBER(6, 2) NOT NULL , VOLUMEN    NUMBER(*, 0) NOT NULL , FOREIGN KEY(czas) references CZAS(ID))";
        PreparedStatement ps=null;
    try{
        ps = returnConnection().prepareStatement(createTable);

    }catch(SQLException e){
        System.out.println("Error with preperadStatement(create table): "+ e.getMessage());
    }

    try{
        ps.execute();

        returnConnection().commit();
        ps.close();
        closeConnection();
    }
    catch(SQLException e){
        System.out.println("Error with execute: "+ e.getMessage());
    }

}


public boolean ifExistTable(String tablename) throws SQLException{
    String sql = "Select TABLE_NAME from user_tables where table_name='"+tablename.toUpperCase()+"' ";  
    System.out.println(sql);
    ResultSet rs =null;
    Statement ps = null;
    try{
        ps = returnConnection().createStatement();
    }catch(SQLException e){
        System.out.println("Error with preperadSatement(checking): "+ e.getMessage());
    }
    try{
        rs=ps.executeQuery(sql);
            while (rs.next()){
                System.out.println (rs.getString(1));   // Print col 1
                    if(rs.getString(1).equals(tablename)){
                            return true;
                    }
            }
    }
    catch(SQLException e){
        System.out.println("Error with executing checking " +e.getMessage()+ " " + e.getStackTrace());
    }
    ps.close();
    return false;
}

это то, как я использую в методе Main: (condDB - это объект, который имеет методы выше)

enter code here String table_name="BBB";
    System.out.println(conDB.ifExistTable(table_name));
    conDB.prepStatExecuteCreateTable(table_name);

поэтому, если я запускаю первым, я получаю сообщение "false" (таблица не существует) и создан (проверьте разработчиком SQL, появится таблица с именем «BBB») при втором запуске я получаю сообщение «false» и сообщение об ошибке из второго метода: Ошибка выполнения: ORA-00955: имя уже используется существующим объектом

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

1) Ваша функция ifExistTable действительно должна использовать переменные связывания, а не создавать оператор SQL с использованием конкатенации строк, если только это позволяет избежать атак с использованием SQL-инъекций.

2) Ваша функция ifExistTable выполняет запрос, который использует верхний регистр переданного значения tablename. Но затем, когда вы извлекаете данные из rs, вы делаете регистрозависимое сравнение с rs.getString(1).equals(tablename). Как минимум, это должно быть equalsIgnoreCase. Но в Java не нужно вообще делать сравнение, поскольку ваш оператор SQL уже делает это. Если у ResultSet есть строка, таблица существует (или вы можете написать запрос как COUNT(*) и проверить, имеет ли возвращаемая строка значение '1').

0 голосов
/ 28 февраля 2012

Возможно, когда вы создали свою хранимую процедуру внутри пакета, вы не закрыли ее с помощью '/'

...
END;
/

, поэтому соединение застряло и ресурс не освобожден для использования другим запросом(что на самом деле является еще одной логической связью).commit не будет работать, так как вы выполняете предложение DDL, которое может меньше заботиться о совершении хе-хе

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