2012-02-28 83 views
0

我在Oracle數據庫上通過JDBC控制器創建表格時遇到問題。 當我通過「creata table ....」創建表時沒問題。表創建,我看到SQL Developer的表。我有方法來檢查是否存在具有該名稱的表 - 它運作良好。 所以,當我創建表(我嘗試做承諾,太 - 不幫忙),表出現在SQL開發人員,但是當我用我的方法檢查,如果該表存在,我得到「假」(不存在),當我重新啓動數據庫並再次運行,我的方法返回'true'。 我認爲會議有問題,但我現在不知道如何解決這個問題。通過JDBC在Oracle數據庫中創建表格

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; 
} 

這是我的主要方法是如何使用:(condDB是具有上述方法的對象)

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

,所以如果我跑第一,我得到消息,「假」(表不存在) ,並創建(通過SQL開發人員,表名「BBB」出現) 檢查,當我運行其次,我得到消息,「假」和錯誤消息從第二個方法: 錯誤與執行:ORA-00955:名稱已由現有物體使用

+0

聽起來像是您的權利問題。您的過程無法看到表格,因爲它沒有看到它的權利。 – 2012-02-28 16:43:50

+2

我們可以看到創建表的代碼和檢查它是否存在的代碼? – GriffeyDog 2012-02-28 16:53:34

+0

@Mthethew Farwell:我不這麼認爲。當他重新啓動數據庫,程序看到表... – 2012-02-28 16:54:42

回答

0

也許當你創建的包內存儲過程,你沒有與關閉「/」

... 
END; 
/

這樣的連接stucked和資源不釋放被其他查詢中使用(實際上是另一個邏輯連接)。提交將不起作用,因爲你正在執行的DDL句子可能不太關注提交hehehe

2

1)您的ifExistTable函數確實應該使用綁定變量,而不是使用字符串連接構建SQL語句,只是爲了避免SQL注入攻擊。

2)你ifExistTable功能正在運行,它使用傳入的tablename的大寫值的查詢。但是當你從rs獲取數據,你正在做一個區分大小寫的比較rs.getString(1).equals(tablename)。至少應該是equalsIgnoreCase。但是,由於您的SQL語句已經在執行,所以在Java中不應該進行比較。如果ResultSet有一排表中存在(或者你可以編寫查詢作爲COUNT(*)並檢查返回的行是否有「1」的值)。

+0

我不SQL注入進行,因爲這是我自己用的:) 大寫的我使用的,因爲在總表名Oracle使用大寫(在SQL statment是無關緊要的) – user1055201 2012-02-28 17:57:59

+0

@ user1055201 - 表名稱將被存儲在假設您沒有使用區分大小寫的標識符,數據字典中的大寫字母。但是在從結果集中提取的代碼中,您正在進行區分大小寫的比較。如果傳遞給函數的表名不是大寫,那麼即使查詢確定該表確實存在,「equals」比較也會失敗。 – 2012-02-28 18:09:30

+0

我查過了,你有權利。 這是一個有趣的愚蠢的錯誤。 所以對於其他人:當我嘗試使用名稱創建表格時,例如'kkkk'Oracle開發人員顯示這個名字,如'KKKK',如果我檢查是否存在名爲'kkkk'的表,我會得到'false'。 謝謝! – user1055201 2012-02-28 18:15:24