0

Javaアプリケーション内からMySQLストアドプロシージャを呼び出そうとしています。ただし、次のエラーが発生しますjava.sql.SQLException: Internal error when parsing callable statement metadata (missing parameter type)

アプリケーションの外部から呼び出された場合、ストアドプロシージャは正しく機能します。また、アプリケーションはデータベースに正常に接続します。

  • MySQLサーバー:5.5.27
  • Javaバージョン「1.7.0_15」
  • Java(TM)SEランタイム環境(ビルド1.7.0_15-b03)
  • Java HotSpot(TM)64ビットサーバーVM(ビルド23.7-b01、混合モード)

どんな援助でも大歓迎です。ありがとう!

Javaコード:

protected Connection mysql;
...
try {
    CallableStatement query = this.mysql.prepareCall("{call spInsertUser(?,?,?,?,?,?,?)}");
    query.setString(1, "user");
    query.setString(2, "password");
    query.setString(3, "test");
    query.setString(4, "test");
    query.setString(5, "test");
    query.setString(6, "test");
    query.setString(7, "test");
    query.execute();
    query.close();
    this.mysql.close();
}
catch (SQLException e) {
    e.printStackTrace();
}

MySQLストアドプロシージャ

CREATE DEFINER = `root`@`localhost` PROCEDURE `spInsertUser`(IN `nick` varchar(30),IN `pass` varchar(255),IN `param1` varchar(255),IN `param2`varchar(255),IN `param3` varchar(22), IN `param4` varchar(255), IN `param5` varchar(255))
    SQL SECURITY INVOKER
BEGIN
  DECLARE uid INT DEFAULT 0;

  # check if nick exists
  DECLARE userExists INT DEFAULT 0;
  SELECT count(*) INTO userExists FROM users WHERE nick = nick;
  IF (userExists > 0) THEN
    # do nothing if nick already exists
    # SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'User already exists!';
  ELSE
    # if nick doesn't exist, insert it
    INSERT INTO users (nick, pass, param1, created, active, param2) VALUES (nick, pass, param1, UNIX_TIMESTAMP(), 0, param2);
    SELECT LAST_INSERT_ID() INTO uid;

    IF (uid IS NOT NULL AND uid > 0) THEN
      # create email
      INSERT INTO emails (uid, email) VALUES (uid, email);
    END IF;
  END IF;
END

エラー:

java.sql.SQLException: Internal error when parsing callable statement metadata (missing parameter type)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1836)
at com.mysql.jdbc.DatabaseMetaData.getProcedureOrFunctionColumns(DatabaseMetaData.java:4305)
at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:4146)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:856)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:629)
at com.mysql.jdbc.JDBC4CallableStatement.<init>(JDBC4CallableStatement.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.CallableStatement.getInstance(CallableStatement.java:523)
at com.mysql.jdbc.ConnectionImpl.parseCallableStatement(ConnectionImpl.java:4313)
at com.mysql.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:4397)
at com.mysql.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:4371)
at pack.File.method(File.java:65)
4

3 に答える 3

0

これは確かに最も理想的な解決策ではありませんが、DROPこのエラーを回避するために(同じ)ストアドプロシージャを再定義しました。メタデータがいくらか壊れていたようです。

于 2013-03-27T12:20:43.953 に答える
0

私の場合、名前とタイプの間に空白を入れずにパラメーターを定義すると、エラーが発生することがわかりました。

CREATE DEFINER = `root`@`localhost` PROCEDURE `spInsertUser`(IN `nick` varchar(30),IN `pass` varchar(255),IN `param1` varchar(255),IN `param2`varchar(255),IN `param3` varchar(22), IN `param4` varchar(255), IN `param5` varchar(255))

param2varchar(255)はvarchar(255)である必要がありparam2ます

于 2015-03-09T15:57:25.323 に答える
0

あなたはあなたのSQLコードをチェックする必要があります、空白についてチェックしてください。

CREATE DEFINER=`root`@`localhost` PROCEDURE `verifyregister`(IN `cdkey` varchar(16), IN `ingsid` int, IN `inusername` varchar(128) character set utf8, OUT `retcode` int)
于 2016-07-16T08:50:30.927 に答える