PreparedStatement表名无效

时间:2018-01-05 01:47:57

标签: java prepared-statement

我正在尝试使用预准备语句创建一个新表但我收到错误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");
}

1 个答案:

答案 0 :(得分:1)

表名不可能是预准备语句中的参数。允许这样做可能会带来安全风险。因此,通常您需要为每个不同的表单独准备一个语句。因此,这将为您提供以下选项:

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列,以区分一个用户的记录与另一个用户。