This question already has answers here:
Using Prepared Statements to set Table Name
(7个答案)
2年前关闭。
我试图使用预处理语句创建新表,但收到错误ORA-00903:无效的表名。我能够在Oracle SQL Developer中执行相同的命令,但不能使用预准备语句。
但是,您似乎正在尝试为每个用户创建一个单独的表。几乎可以肯定,这不是必须的,甚至是不希望的。相反,只需为所有用户创建一个表,然后在该表中添加
(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/