[英]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.