JDBC PrepareStatement参数不适用于CREATE,DROP,ALTER

时间:2017-10-05 07:46:41

标签: java oracle jdbc ojdbc

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

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

但是,由于用户提供了用户名和密码,因此它们可能包含空格,半列,引号等特殊字符,这可能会使上述语句无效。我不希望我的代码对用户名和密码进行验证,并将其留给Oracle进行验证。因此,我想到在预准备语句中使用参数:

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

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

1 个答案:

答案 0 :(得分:5)

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

PreparedStatement参数标记(?)用于提供各种数据类型的动态值。它们不能用于提供标识符,例如您无法执行SELECT * FROM ?之类的操作来动态指定表名。

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

一样
  

如果密码以非字母字符开头,或者包含字母数字字符以外的字符,下划线(_),美元符号($)或井号(#),则必须用双字符括起来引号。否则,将密码括在双引号中是可选的。