【问题标题】:Bad SQL grammar糟糕的 SQL 语法
【发布时间】:2020-09-22 10:07:12
【问题描述】:

在 java 代码中执行时(db -MS SQL Server)

@Test
public void check (){
String sql = "DECLARE @aa int;\n" +
        "EXEC dbo.sc_CheckCode\n" +
        "    @Code = '2002620020210968',\n" +
        "    @Result =  @aa OUT";
try {
    Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
    System.out.println("result: " + integer);
 } catch (Exception ex) {
    System.out.println("error" + ex.getMessage());
 }
}

结果:

StatementCallback; bad SQL grammar [DECLARE @aa int;
EXEC dbo.sc_CheckCode
@Code = '2002620020210968',
@Result =  @aa OUT]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in expression SQL "DECLARE @[*]AA INT;
EXEC DBO.SC_CHECKCODE
@CODE = '2002620020210968',
@RESULT =  @AA OUT"; expected "OR, FORCE, VIEW, ALIAS, SEQUENCE, USER, TRIGGER, ROLE, SCHEMA, CONSTANT, DOMAIN, TYPE, DATATYPE, AGGREGATE, LINKED, MEMORY, CACHED, LOCAL, GLOBAL, TEMP, TEMPORARY, TABLE, SYNONYM, PRIMARY, UNIQUE, HASH, SPATIAL, INDEX"

预期结果 = 0 或 -1

我无法理解语法错误是什么...

当我在 DBeaver 中执行时 - 确定(将 select @aa 添加到显示结果的末尾;)

【问题讨论】:

  • 我不确定SQL Server JDBC驱动是否支持这样执行SQL代码,主要是select/insert/update/delete。
  • @TimBiegeleisen 它就像“从 CODE = 的表中选择结果?”。我希望结果为 0 或 -1
  • @aa 应该是在您的 Java 中声明并传递给准备好的语句的(输出)参数,而不是在语句中声明。以上不会将@aa 的值“返回”给应用层,因为它只是在 SQL 范围内定义的变量。

标签: java sql-server jdbc


【解决方案1】:

删除换行符

\n

再试一次

【讨论】:

  • no( 结果:"PreparedStatementCallback;SQL 语法错误....
【解决方案2】:

试试这个

List<SqlParameter> parameters = Arrays.asList(
            new SqlParameter(Types.String), new SqlOutParameter("aa", Types.Integer));

    Map<String, Object> t = jdbcTemplate.call(new CallableStatementCreator() {
        @Override
        public CallableStatement createCallableStatement(Connection con) throws SQLException {
            CallableStatement callableStatement = con.prepareCall("{call DBO.SC_CHECKCODE (?, ?)}");
            callableStatement.setString(1, code);
            callableStatement.registerOutParameter(2, Types.Integer);
            return callableStatement;
        }
    }, parameters);

https://www.logicbig.com/tutorials/spring-framework/spring-data-access-with-jdbc/spring-call-stored-procedure.html

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多