我想使用jdbcTemplate在条件下创建基于另一个表的表。我有postgres数据库。当我执行这个并传递参数:
String SQL = "create table test as (select * from users where countryId =?)";
jdbcTemplate.update(SQL, new Object[] {3})
我从users表中收到包含所有列但没有行的test表。
然而,当我执行这个:
String SQL = "create table test as (select * from users where countryId =3)";
jdbcTemplate.update(SQL)
我收到测试表的行,其中countryId = 3,所以这是我期望在第一个解决方案中收到的。
您传递的bind变量不正确,但它没有发挥任何作用。
你简单的不能在数据定义语句中使用绑定变量,就像你在触发错误
中立即看到的那样Caught: org.springframework.jdbc.UncategorizedSQLException:
PreparedStatementCallback; uncategorized SQLException for SQL
[create table test as (select * from users where countryId =?)];
SQL state [72000]; error code [1027];
ORA-01027: bind variables not allowed for data definition operations
因此,您有两个选择,要么连接语句(由于存在SQL注入的危险,不建议这样做)
或将语句分成两部分:
// create empty table
sql = "create table test as (select * from users where 1 = 0)";
jdbcTemplate.update(sql)
// insert data
sql = "insert into test(countryId, name) select countryId, name from users where countryId =?";
updCnt = jdbcTemplate.update(sql, new SqlParameterValue(Types.INTEGER,3));
注意,在insert
语句中,您可以看到正确的传递3
整数值作为绑定变量的方法。
您也可以遵循以下方法:-
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)");
List<Object[]> employeeIds = new ArrayList<>();
for (Integer id : ids) {
employeeIds.add(new Object[] { id });
}
jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds);
为了避免SQL注入,这里可以使用2个操作进行查询。
您错误地使用了jdbcTemplate
中的update
方法。
试试这个:
String SQL = "create table test as (select * from users where countryId = ?)";
jdbcTemplate.update(SQL, 3);