使用PreparedStatement设置连接级变量时出现SQL语法错误求助
问题原因
SQL Anywhere的CREATE OR REPLACE VARIABLE这类DDL语句不支持使用PreparedStatement的占位符?。这类语句在预编译阶段(也就是conn.prepareStatement(sql)执行时)需要完整明确的语法结构,占位符会被驱动识别为无效的"host variable",直接触发语法错误,根本轮不到执行ps.setInt(1, 123)这一步。
解决方案
有两种可行的处理方式:
方式1:直接拼接SQL(注意SQL注入风险)
如果变量值是固定的、或者来自安全可信的来源,可以直接把值写入SQL字符串,用Statement执行,就像你注释掉的写法一样:try { String sql = "create or replace variable myVariable integer = 123"; Statement stmt = conn.createStatement(); stmt.execute(sql); stmt.close(); // (...more code...) } catch (SQLException e) { System.out.println(e); }方式2:分两步执行(安全避免SQL注入)
先创建变量,再用PreparedStatement给变量赋值,拆分DDL和DML操作:try { // 第一步:创建空变量 String createSql = "create or replace variable myVariable integer"; Statement stmt = conn.createStatement(); stmt.execute(createSql); stmt.close(); // 第二步:用PreparedStatement安全赋值 String setSql = "set myVariable = ?"; PreparedStatement ps = conn.prepareStatement(setSql); ps.setInt(1, 123); ps.execute(); ps.close(); // (...more code...) } catch (SQLException e) { System.out.println(e); }
内容的提问来源于stack exchange,提问作者user25062581
相关产品推荐
相关产品推荐

