暮风沂水 2021-04-30 11:33 采纳率: 100%
浏览 56
已采纳

关于Mycat调用存储过程

package com.text.jdbctest;

import java.sql.*;

public class JdbcTestLocalMysql {
    public static void main(String[] args) throws ClassNotFoundException {
        String storedProcedure = "/*!mycat: sql=SELECT 1 FROM person; */SET @ids:=11;call batchtest(@v_count,11); SELECT @v_count AS v_count;";

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:8066/mysql";
        String user = "mysql";
        String password = "nDtZ7rHYjwM5";

        ResultSet resultSet = null;
        Class.forName(driver);

        try(Connection con = DriverManager.getConnection(url, user, password);){
            try(Statement  statement = con.createStatement();){
                resultSet = statement.executeQuery(storedProcedure);
                while (resultSet.next()){
                    System.out.println(resultSet.getString("v_count"));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

执行后返回:

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call batchtest(@v_count,11); SELECT @v_count AS v_count' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1198)
    at com.text.jdbctest.JdbcTestLocalMysql.main(JdbcTestLocalMysql.java:23)

Mycat版本:Mycat-server-1.6.76-test(GitHub源码)

MySQL版本:mysql8.0
 

  • 写回答

1条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2021-04-30 14:55
    关注

    原因有很多,你可以现在根据你的代码看看是哪一种。

    1、单引号、反单引号分不清

    java中键值用(‘)单引号,列名(`)反单引号。就是上面一排数字键最左边~符号那个,切换英文输入法即为反单引号。比如

    int result = ed.insertData("insert into information(`nowtime`,`data`) values(current_time,'A');");


    insertData就是负责执行这句SQL语句的,他最后返回受影响的条数,这个不用管。

    其中列名分别是nowtime和data(这里用反单引号),写入数据库的值是current_time和字符A(这里用单引号)。

    2、列名包括SQL关键字

    解决办法:修改表名字,比如你的列名不能叫做update等关键字

    3、语法错误

    看看是不是少打空格了
     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题