通过JDBC在Oracle数据库中创建表

时间:2012-02-28 16:39:20

标签: java oracle jdbc

我在Oracle数据库上通过JDBC控制器创建表时遇到问题。 当我通过“creata table ....”创建表格时没问题。表创建,我通过SQL Developer看到该表。我有方法来检查具有该名称的表是否存在 - 并且它运行良好。 因此,当我创建表(我也尝试提交,也没帮助)时,表出现在SQL开发人员中,但当我通过我的方法检查该表是否存在时,我得到'false'(不存在),当我重新启动数据库时并再次运行,我的方法返回'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);

所以如果我先跑,我得到消息“假”(表不存在) 并创建(由SQL开发人员检查,出现名为'BBB'的表) 当我第二次运行时,我从第二种方法得到消息“false”和错误消息: 执行错误:ORA-00955:现有对象已使用名称

2 个答案:

答案 0 :(得分:2)

1)你的ifExistTable函数确实应该使用绑定变量,而不是使用字符串连接来构建SQL语句,只是为了避免SQL注入攻击。

2)您的ifExistTable函数正在运行一个查询,该查询使用传入的tablename的大写值。但是当您从rs获取数据时,您正在与rs.getString(1).equals(tablename)进行区分大小写的比较。至少应该是equalsIgnoreCase。但是由于你的SQL语句已经在做,所以在Java中根本不需要进行比较。如果ResultSet有一行,则表存在(或者您可以将查询写为COUNT(*)并检查返回的行是否具有值'1'。

答案 1 :(得分:0)

也许当你在包中创建存储过程时,你没有用'/'

关闭它
...
END;
/

因此连接被卡住并且资源未被释放以供其他查询(实际上是另一个逻辑连接)使用。提交将无法正常工作,因为您执行的DDL句子可能不太关心提交hehehe