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