2016-06-29 70 views
2

我正在研究一個AAA(認證等..)應用程序在java中,我想知道是否有一種方法來檢查錯誤代碼或任何如果我想要在其中插入數據的表存在。如果它丟失或出現任何類型的問題,程序會自動創建表。
P.S:我查了其他相關的問題,答案並不符合我想要的java程序的檢查。如果它不存在,在oracle數據庫中自動創建一個表

+0

遺憾的語法錯誤或任何可能的錯誤。 –

+0

我不確定你會想要在銀行應用程序中的那種事情。這些系統往往被鎖定很多(並有一個很好的理由)。 – Thilo

+0

@Moudiz它更多的研究知道什麼方式更好,或者有什麼辦法在第一個地方和它的Java方面 –

回答

2

我所知道的最有效的方式,是這樣的:

public static boolean tableExists(String tableName, Connection con) { 
    try (Statement stmt = con.createStatement(); 
     ResultSet trs = stmt.executeQuery(
      String.format(
       "SELECT count(*) from (SELECT 1 FROM %s WHERE ROWNUM = 1) T", 
       tableName 
      ) 
     ) 
    ) { 
     return trs.next(); 
    } 
    catch (SQLException e) { 
     if (LOG.isDebugEnabled()) { 
      LOG.debug("SQLException occurs while checking the table " + tableName, e); 
     } 
     return false; 
    } 
} 

注:的標準方法是用connection.getMetaData().getTables(String catalog, String schemaPattern,String tableNamePattern, String types[])與數據庫中的元數據換句話說,但你需要指定模式名,你需要額外的像oracle這樣的數據庫特權,使用上面的方法,您不必指定模式名稱,因爲它將使用默認的名稱,而且您不需要任何其他特權。即使它可以被認爲是一個有爭議的方法,相信我它工作得很好,事實上我們有數百個客戶在生產。

NB 2:如果你是一個有點好奇,我們甚至推廣這一做法,以使其在最常用的數據庫工作,只有查詢改變一點點,你可以看到here

3

我會用ALL_TABLES(字典)爲:

--your procedure 
--some logic 


--check the table in the dictionary 
SELECT count(*) 
    INTO v_count 
    FROM all_tables s 
WHERE s.table_name = p_table_name; 


IF v_count = 0 THEN 

.... 

END IF; 


--the rest of logic 
相關問題