java - PreparedStatement 无效的表名

标签 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");
}

最佳答案

不可能将表名作为预准备语句中的参数。允许这种情况可能会存在安全风险。因此,一般来说,您需要为每个不同的表准备一个单独的准备语句。因此,您有以下选择:

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/

相关文章:

PHP -> 如何在注册查询中绑定(bind)多个值?

python - 如何使用 python 使用准备好的语句 "select from xxx where xxx"

Java Swing : How to change GUI dynamically

php - 如何将参数数组传递给bind_param?

java - 在java sql准备语句中使用时间戳

java - 数据库连接池上的 try-with 资源是否每次都会关闭连接?

java - 按数组中字符串的长度快速排序

java - AppConfig.java 返回带有私有(private)构造函数的 bean?

java - StringBuffer 的别名

java - 访问 CUDA 内核中的变量时出现 CUDA_ERROR_ILLEGAL_ADDRESS