簡體   English   中英

通過JDBC在Oracle數據庫中創建表

[英]Creating tables in Oracle database by 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);

因此,如果我先運行,我會收到消息“false”(表不存在)並創建(由SQL開發人員檢查,出現名稱為“BBB”的表)當我第二次運行時,我收到消息“false”,並顯示第二條消息方法:執行時出錯:ORA-00955:現有對象已使用name

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

2)你的ifExistTable函數正在運行一個查詢,該查詢使用傳入的tablename的大寫值。但是當你從rs獲取數據時,你正在與rs.getString(1).equals(tablename)進行區分大小寫的比較rs.getString(1).equals(tablename) 至少應該是equalsIgnoreCase 但是由於你的SQL語句已經在做,所以在Java中根本不需要進行比較。 如果ResultSet有一行,則表存在(或者您可以將查詢寫為COUNT(*)並檢查返回的行是否具有值'1')。

也許當你在包中創建存儲過程時,你沒有用'/'關閉它

...
END;
/

因此連接被卡住並且資源沒有被釋放以供其他查詢使用(這實際上是另一個邏輯連接)。 提交將無法正常工作,因為您正在執行一個DDL句子,而這個句子可能不太關心提交hehehe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM