JDBC CallableStatement: java.sql.SQLException: пользователь, указанный в качестве определителя (‘mysql.infoschema’@’localhost’), не существует

#java #mysql #jdbc

#java #mysql #jdbc

Вопрос:

Я только начал связываться с JDBC и столкнулся с некоторой проблемой, связанной с CallableStatement, вот мой код:

     Connection connection=null;
    CallableStatement statement=null;

    try {
        connection = DriverManager.getConnection(DBTools.getDbUrl(), DBTools.getUSER(),DBTools.getPASSWD());
        String getNameSQL="{call getName (?,?)}";
        statement=connection.prepareCall(getNameSQL);
        int empID=103;
        String empName;
        statement.setInt(1,empID);
        statement.registerOutParameter(2, Types.VARCHAR);
        System.out.println("Execute: " statement.execute());
        empName=statement.getString(2);
        System.out.println("Emp Name with ID:"   empID   " is "   empName);
        statement.close();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
  

Его вывод на консоль является:

 java.sql.SQLException: The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1020)
at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.executeMetadataQuery(DatabaseMetaDataUsingInfoSchema.java:70)
at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.getProcedureColumns(DatabaseMetaDataUsingInfoSchema.java:769)
at com.mysql.cj.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:790)
at com.mysql.cj.jdbc.CallableStatement.<init>(CallableStatement.java:585)
at com.mysql.cj.jdbc.CallableStatement.getInstance(CallableStatement.java:484)
at com.mysql.cj.jdbc.ConnectionImpl.parseCallableStatement(ConnectionImpl.java:1523)
at com.mysql.cj.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:1548)
at com.mysql.cj.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:1539)
at main.JDBCCallableStatement.main(JDBCCallableStatement.java:13)
  

Строка 13 выглядит так: оператор=соединение.prepareCall(getNameSQL);

Я уверен, что функция mysql getName() была создана и работает хорошо, похоже, проблема в подключении, но я не знаю, как это исправить, надеюсь, вы можете дать мне несколько предложений.

Комментарии:

1. Кстати, код <connection = DriverManager.getConnection(DBTools.getDbUrl(), DBTools.getUser(), DBTools.getPASSWD()); > хорошо работает в моем другом проекте, использующем Statement и PreparedStatement , возможно, мой способ использования CallableStatement неверен.

2. где вы установили второй параметр ?

3. частная статическая конечная строка DB_URL = «jdbc: mysql://localhost:3306/test_db»; частная статическая конечная строка USER = «root»;