我想在java for oracle
创建一个表,同时从用户获取表的名称,或者像程序变量一样:
String query= CREATE TABLE ? (ID NUMBER , NAME VARCHAR2(20));
PreparedStatement preStatement = connection.prepareStatement(query );
preStatement.setString(1,tableNAME);
但我有INVALID TABLE NAME
错误;
如何达到此目的(通过动态名称创建表格)?
非常感谢!答案 0 :(得分:1)
您始终可以将tablename连接到字符串(在检查SQL注入的可能性之后)。
String query= "CREATE TABLE " + tablename + " (ID NUMBER , NAME VARCHAR2(20))";
答案 1 :(得分:0)
在准备好的Statement中,它首先编译查询然后绑定值。因此,您无法通过预准备语句将tablename设置为查询。
正常将表名附加到查询会导致Sql注入
最好的方法是将表名列入白名单并检查其中的表名。并使用它。
其他
尝试下面的方法,它将避免SQL注入。
String tableName = urtablename;
String query= String.format("CREATE TABLE \"%s\" (ID NUMBER , NAME VARCHAR2(20))", tableName.replace("\"", "\"\""));