Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringJDBC——糟糕的SQL语法_Spring_Jdbc - Fatal编程技术网

SpringJDBC——糟糕的SQL语法

SpringJDBC——糟糕的SQL语法,spring,jdbc,Spring,Jdbc,我正在学习Spring教程,在JDBC部分遇到了一个问题。代码是直接从教程本身复制的,在失败的调用之前,对数据库的多次调用都正确运行。有人能帮我吗?这是我的错误跟踪 Jul 31, 2012 9:40:03 PM org.springframework.jdbc.core.metadata.GenericCallMetaDataProvider processProcedureColumns WARNING: Error while retrieving metadata for procedu

我正在学习Spring教程,在JDBC部分遇到了一个问题。代码是直接从教程本身复制的,在失败的调用之前,对数据库的多次调用都正确运行。有人能帮我吗?这是我的错误跟踪

Jul 31, 2012 9:40:03 PM org.springframework.jdbc.core.metadata.GenericCallMetaDataProvider processProcedureColumns
WARNING: Error while retrieving metadata for procedure columns: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: FUNCTION getrecord does not exist
Jul 31, 2012 9:40:03 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
Jul 31, 2012 9:40:03 PM org.springframework.jdbc.support.SQLErrorCodesFactory <init>
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]    Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call getrecord()}]; nested exception is com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: FUNCTION getrecord does not exist
        at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:969)
        at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1003)
        at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:391)
        at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:354)
        at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:181)
        at com.tutorialspoint.StudentJDBCTemplate.getStudent(StudentJDBCTemplate.java:32)
        at com.tutorialspoint.MainApp.main(MainApp.java:29)
    Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: FUNCTION getrecord does not exist
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
        at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
        at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1607)
        at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:4034)
        at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:709)
        at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
        at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4583)
        at com.mysql.jdbc.Connection.prepareCall(Connection.java:4657)
        at com.mysql.jdbc.Connection.prepareCall(Connection.java:4631)
        at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:167)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:947)
        ... 6 more
StudentJDBCTemplate有这两个变量

private DataSource dataSource;
private SimpleJdbcCall jdbcCall;
StudentJDCBTemplate这样设置数据源,这可能是问题的根源,因为我不知道getRecord指的是什么

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    this.jdbcCall = new SimpleJdbcCall(dataSource)
            .withProcedureName("getRecord");
}
问题出现在StudentJDBCTemplate的此方法中

public Student getStudent(Integer id) {
    SqlParameterSource in = new MapSqlParameterSource().addValue("in_id",
            id);
    Map<String, Object> out = jdbcCall.execute(in);
    Student student = new Student();
    student.setId(id);
    student.setName((String) out.get("out_name"));
    student.setAge((Integer) out.get("out_age"));
    return student;
}

您正在尝试执行存储过程“getrecord”。数据库中不存在或未正确编译的。尝试首先通过数据库端的SQL客户端执行


过程应与签名匹配,作为两个输出参数和一个输入参数。

您正在尝试执行存储过程“getrecord”。数据库中不存在或未正确编译的。尝试首先通过数据库端的SQL客户端执行


过程应与签名匹配,作为两个输出参数和一个输入参数。

原因:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:函数getrecord不存在..
请检查一次。。创建getrecord函数并重试一次..

原因:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:函数getrecord不存在..
请检查一次。。创建getrecord函数并重试一次。

在执行以下操作后,您错过了创建
getrecord
存储过程的过程:

DELIMITER $$

DROP PROCEDURE IF EXISTS `TEST`.`getRecord` $$
CREATE PROCEDURE `TEST`.`getRecord` (
IN in_id INTEGER,
OUT out_name VARCHAR(20),
OUT out_age  INTEGER)
BEGIN
   SELECT name, age
   INTO out_name, out_age
   FROM Student where id = in_id;
END $$

DELIMITER ;
执行以下操作后,您错过了
getRecord
存储过程的创建:

DELIMITER $$

DROP PROCEDURE IF EXISTS `TEST`.`getRecord` $$
CREATE PROCEDURE `TEST`.`getRecord` (
IN in_id INTEGER,
OUT out_name VARCHAR(20),
OUT out_age  INTEGER)
BEGIN
   SELECT name, age
   INTO out_name, out_age
   FROM Student where id = in_id;
END $$

DELIMITER ;

如果您使用的是MySQL Connector版本6.x而不是5.x,那么为了防止2017年有人遇到这种情况,这里需要对旧教程进行必要的更改

在Beans.xml中,此行应为:

<property name="url" value="jdbc:mysql://localhost:3306/test?nullNamePatternMatchesAll=true" />

而不是:
如果您使用的是MySQL Connector版本6.x而不是5.x,那么为了防止2017年有人遇到这一问题,这里需要对旧教程进行必要的更改

在Beans.xml中,此行应为:

<property name="url" value="jdbc:mysql://localhost:3306/test?nullNamePatternMatchesAll=true" />

而不是:
请注意我对问题原始陈述所做的更改。请注意我对问题原始陈述所做的更改。谢谢。这正是我需要的。不知怎的,我错过了创建那个存储过程。谢谢。这正是我需要的。不知何故,我错过了创建那个存储过程。
<property name="url" value="jdbc:mysql://localhost:3306/test?nullNamePatternMatchesAll=true" />