使用jdbcTemplate以select方式创建表



我想使用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);

相关内容

  • 没有找到相关文章