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

use*_*403 3 java oracle jdbc ojdbc

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

PreparedStatement preparedStatement = connection.prepareStatement("create user " + username + " identified by " + password);
preparedStatement.execute();
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*eas 5

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

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

字符串连接是唯一的方法,"如果标识符包含特殊字符,则需要引用()标识符,就像文档说的那样:

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