gpt4 book ai didi

java - 通过 JDBC 在 Oracle 数据库中创建表

转载 作者:行者123 更新时间:2023-12-02 07:57:02 27 4
gpt4 key购买 nike

我在 Oracle 数据库上通过 JDBC Controller 创建表时遇到问题。当我通过“create table....”创建表时就可以了。创建表,我看到 SQL Developer 生成的表。我有方法检查具有该名称的表是否存在 - 并且效果很好。因此,当我创建表时(我也尝试提交 - 没有帮助),表出现在 SQL Developer 中,但是当我通过我的方法检查该表是否存在时,当我重新启动数据库时,我得到“假”(不存在)再次运行,我的方法返回“true”。我认为这是 session 的问题,但我现在不知道如何解决这个问题。

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:名称已被现有对象使用

最佳答案

1) 如果只是为了避免 SQL 注入(inject)攻击,您的 ifExistTable 函数确实应该使用绑定(bind)变量,而不是使用字符串连接构建 SQL 语句。

2) 您的 ifExistTable 函数正在运行一个查询,该查询使用传入的 tablename 的大写值。但是当您获取数据时在 rs 中,您将与 rs.getString(1).equals(tablename) 进行区分大小写的比较。至少应该是equalsIgnoreCase。但在 Java 中根本不需要进行比较,因为您的 SQL 语句已经在进行比较了。如果 ResultSet 有一行,则该表存在(或者您可以将查询编写为 COUNT(*) 并检查返回的行是否有值'1')。

关于java - 通过 JDBC 在 Oracle 数据库中创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com