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:
establecer la propiedad
noAccessToProcedureBodies=true
la conexiónPor 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.
Otorgar privilegios
SELECT
enmysql.proc
al usuario de la base de datosPor 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''.