我在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:现有对象已使用名称
答案 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