usando stored procedimientos procedimiento para llamar ejemplo ejecutar desde consume con como callablestatements callablestatement almacenados almacenado java mysql stored-procedures privileges

stored - procedimientos almacenados en java netbeans



No se puede ejecutar un procedimiento almacenado de MySQL desde Java (4)

Me estoy conectando a una base de datos MySQL (5.08) que se ejecuta en una máquina Linux desde una aplicación web que se ejecuta en tomcat.

Obtengo la siguiente excepción cuando intento ejecutar un procedimiento almacenado:

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

Después de instalar mysql en la máquina. He dado las siguientes opciones de subvención para rootear

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)

En la clase java ...

Me estoy conectando a la base de datos de la siguiente manera:

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

También probé la URL con la opción noAccessToProcedureBodies=true incluida.

¿Puede alguien decirme qué está mal aquí? ¿Hay algo que deba verificar?


Ejecutar debajo de las consultas debería solucionar su problema.

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


Hay dos formas de resolver esto:

  1. establecer la propiedad noAccessToProcedureBodies=true la conexión

    Por ejemplo, como parte de la cadena de conexión:

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

    El controlador JDBC creará cadenas "INOUT" para los argumentos sin requerir metadatos como dice la excepción.

  2. Otorgar privilegios SELECT en mysql.proc al usuario de la base de datos

    Por ejemplo en el prompt mysql:

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

    Por supuesto, esto permitiría a la aplicación leer toda la tabla mysql.proc que contiene información sobre todos los procedimientos almacenados en todas las bases de datos (incluido el código fuente).


Los siguientes pasos me funcionaron en mysql

Paso 1: agregar follwong
Connection con = DriverManager.getConnection ("jdbc: mysql: // direccionip: 3306 / logparser? NoAccessToProcedureBodies = true", "root", "");

Paso 2: OTORGAR TODO EN logparser . proc TO root @ ''%''; donde logparser es el nombre de DB y proc es el nombre del procedimiento.


Puede cambiar el definidor en la tabla mysql.proc a su usuario de base de datos.

seleccione * de mysql.proc;

elija el proceso almacenado que tiene problema y cambie el definidor a ''yourdbuser'' @ ''localhost''.