Не удается выполнить хранимую процедуру MySQL из Java - PullRequest
27 голосов
/ 12 июня 2009

Я подключаюсь к базе данных MySQL (5.08), работающей на машине linux, из веб-приложения, работающего на tomcat.

При попытке выполнить хранимую процедуру я получаю следующее исключение:

com.hp.hpl.chaos.web.exception.DBException: getNextValue for operatorinstance[Additional Information from SQL Exception][SQLErrorCode: 0 SQLState: S1000
    at com.hp.hpl.chaos.web.util.SQLUtil.getNextValue(SQLUtil.java:207)
        ..............

Caused by: java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1619)
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 com.hp.hpl.chaos.web.util.SQLUtil.getNextValue(SQLUtil.java:196)
... 17 more

После установки mysql на машину. Я дал следующие варианты гранта root

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

В классе Java ..

Я подключаюсь к БД следующим образом:

String url = "jdbc:mysql://ipaddress:3306/test";
                con = DriverManager.getConnection(url,"root", "pass");

Я также пробовал URL с включенной опцией noAccessToProcedureBodies=true.

Может кто-нибудь сказать мне, что здесь не так? Что мне нужно проверить?

Ответы [ 4 ]

61 голосов
/ 06 января 2011

Есть два способа решить эту проблему:

  1. установить свойство соединения noAccessToProcedureBodies=true

    Например, как часть строки подключения:

    jdbc:mysql://ipaddress:3306/test?noAccessToProcedureBodies=true
    

    Драйвер JDBC затем создаст строки «INOUT» для аргументов, не требуя метаданных, как говорит исключение.

  2. Предоставление SELECT привилегий на mysql.proc пользователю базы данных

    Например, в приглашении mysql:

    GRANT SELECT ON mysql.proc TO 'user'@'localhost';
    

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

2 голосов
/ 22 июля 2015

Следующие шаги работали у меня в MySQL

Шаг 1: добавить следующий
Connection con = DriverManager.getConnection ("jdbc: mysql: // ipaddress: 3306 / logparser? NoAccessToProcedureBodies = true", "корень", "");

Шаг 2: GRANT ALL ON logparser. proc TO root @ '%'; где logparser - это имя БД, а proc - имя процедуры.

0 голосов
/ 11 января 2018

Вы можете изменить определитель в таблице mysql.proc на пользователя вашей базы данных.

выберите * из mysql.proc;

выберите хранимый процесс, у которого есть проблема, и измените определитель на'yourdbuser'@'localhost'.

0 голосов
/ 06 июня 2017

Выполнение запросов ниже должно решить вашу проблему.

GRANT <SELECT, CREATE, UPDATE, DELETE, ALL> PRIVILEGES ON mysql.proc TO '<user>'@'%';
FLUSH PRIVILEGES;
...