java - JDBC PrepareStatement 参数不适用于 CREATE、DROP、ALTER

标签 java oracle jdbc ojdbc

<分区>

我需要使用 JDBC 创建一个新的 Oracle 用户。新用户的用户名和密码由用户通过 GUI 提供。以下代码工作正常(我也可以使用 Statement 而不是 PreparedStatement)。

PreparedStatement preparedStatement = connection.prepareStatement("create user " + username + " identified by " + password);
preparedStatement.execute();

但由于用户名和密码由用户自行提供,其中可能包含空格、分号、引号等特殊字符,可能导致上述声明无效。我不希望我的代码对用户名和密码进行验证,并将其留给 Oracle 进行验证。因此,我想到了使用prepared statement中的参数来代替:

PreparedStatement preparedStatement = connection.prepareStatement("create user ? identified by ?");
preparedStatement.setString(1, userName);
preparedStatement.setString(2, password);
preparedStatement.execute();

但它根本不起作用。当我提供有效的用户名和密码时,我将收到“ORA-01935:缺少用户名或角色名”。这些参数似乎不适用于 CREATE、DROP、ALTER 语句。如何解决我的问题?提前致谢。

最佳答案

用户名和密码不是文本值,而是标识符

PreparedStatement 参数标记 (?) 用于提供各种数据类型的动态值。它们不能用于提供标识符,例如您不能像 SELECT * FROM ? 那样动态指定表名。

字符串连接是唯一的方式,如果标识符包含特殊字符,则需要用引号将其引号("),就像documentation says :

If a password starts with a non-alphabetic character, or contains a character other than an alphanumeric character, the underscore (_), dollar sign ($), or pound sign (#), then it must be enclosed in double quotation marks. Otherwise, enclosing a password in double quotation marks is optional.

关于java - JDBC PrepareStatement 参数不适用于 CREATE、DROP、ALTER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580459/

相关文章:

Java SQL : Statement. hasResultSet()?

java - 在库文件中使用hive-jdbc-2.0.0-standalone.jar时,jsp文件失败

java - 实现基于 REST 的身份验证

Java导入库源码ExceptionInInitializerError异常

java - 请解释以下代码的作用?

sql - 如何在Oracle 10g中执行 "selective where"?

javascript - 使用 oracle 查询创建图表

java - 如何将动态值传递给java servlet?

google-app-engine - 为什么我不断收到 "No suitable driver found"错误?

java - 必须从工作线程调用publishProgress方法,当前推断的线程是主线程