2017-10-05 43 views
2

我需要使用JDBC来创建新的Oracle用户。新用户的用户名和密码由用户通过GUI提供。以下代码工作正常(我也可以使用Statement而不是PreparedStatement)。JDBC PrepareStatement参数不适用于CREATE,DROP,ALTER

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语句不起作用。如何解决我的问题?提前致谢。

回答

4

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

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

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

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

+0

好的,我明白了。我只需要使用正常的语句,并用双引号括住用户名和密码。谢谢! – user3573403