This question already has answers here:
Using Prepared Statements to set Table Name
                            
                                (7个答案)
                            
                    
                2年前关闭。
        

    

我试图使用预处理语句创建新表,但收到错误ORA-00903:无效的表名。我能够在Oracle SQL Developer中执行相同的命令,但不能使用预准备语句。

try{
    String createMessageTable = "CREATE TABLE ? (chat_with VARCHAR2(255), chatTableName VARCHAR2(255))";
    String tempTable = user.getUsername() + "MessageList";
    PreparedStatement ps1 = dbSingleton.getPreparedStatement(createMessageTable);
    System.out.println(ps1.toString());
    ps1.execute();
}catch(SQLException e){
    e.printStackTrace();
    System.out.println("Unable to create Table");
}

最佳答案

在准备好的语句中,不能将表名作为参数。允许这样做可能会带来安全风险。因此,一般而言,您需要为每个不同的表单独准备一个语句。因此,您可以使用以下选项:

try {
    StringBuilder sb = new StringBuilder("");
    sb.append("CREATE TABLE ");
    sb.append(user.getUsername()).append("MessageList");
    sb.append(" (chat_with VARCHAR2(255), chatTableName VARCHAR2(255))";
    PreparedStatement ps1 = dbSingleton.getPreparedStatement(sb.toString());
    System.out.println(ps1.toString());
    ps1.execute();
} catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Unable to create Table");
}


但是,您似乎正在尝试为每个用户创建一个单独的表。几乎可以肯定,这不是必须的,甚至是不希望的。相反,只需为所有用户创建一个表,然后在该表中添加userId列即可将一个用户的记录与另一个用户区分开。

关于java - PreparedStatement无效的表名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48106124/

10-11 14:44
查看更多