编程语言
首页 > 编程语言> > java – JDBC PrepareStatement参数不适用于CREATE,DROP,ALTER

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

作者:互联网

参见英文答案 > ORA-00903: invalid table name on PreparedStatement                                    1个
>            Create a dynamic name table with Prepared Statement in java                                    2个
>            Using Prepared Statements to set Table Name                                    6个
>            Escaping single quotes in table SQL queries                                    3个
我需要使用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语句.如何解决我的问题?提前致谢.

解决方法:

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

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,oracle,jdbc,ojdbc
来源: https://codeday.me/bug/20190828/1750155.html