Bug #9682 CallableStatement failes when Stored Procedure created with Decimal(m,d) type.
Description:
When calling a stored procedure with datatype Decimal(m,d) (i.e. Decimal(18,0)) the Connector/J library throws the exception below. After looking into the code it appears that the getCallStmtParameterTypes method does not expect that a parameter datatype could include a comma. Therefore, any stored procedure created with a compound datatype: Float(M,D), Decimal(M,D), etc... will have this problem.
Error Message:
java.sql.SQLException: Internal error when parsing callable statement metadata (missing parameter type)
at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:6902)
Error in JDBC sampling: java.sql.SQLException: Internal error when parsing callable statement metadata (missing parameter type)
at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:2653)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:1042)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:83)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:1248)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:1225)
at TestCallableStatement.<init>(TestCallableStatement.java:34)
at TestCallableStatement.main(TestCallableStatement.java:112)
How to repeat:
Create Stored Procedure:
DELIMITER //
DROP PROCEDURE IF EXISTS TEST_PROC//
CREATE PROCEDURE TEST_PROC(decimalParam DECIMAL(18,0))
BEGIN
SELECT param_list FROM mysql.proc WHERE name='TEST_PROC';
END
//
Create Java / JDBC Program to call Stored Procedure
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.CallableStatement;
public class TestClass
{
public TestClass()
{
Connection conn = null;
CallableStatement cStmt = null;
try
{
// Load class
Class.forName("com.mysql.jdbc.Driver");
// Modify URL with correct user, pass, host, and db name
conn = DriverManager.getConnection("jdbc:mysql://<HOST>/<DB>?user=<USER>&password=<PASS>");
cStmt = conn.prepareCall("Call TEST_PROC(?)");
cStmt.setDouble(1, 18.0);
cStmt.execute();
}
catch (Exception ex)
{
System.out.println("Error: " + ex);
ex.printStackTrace();
}
finally
{
if (cStmt != null)
{
try
{
cStmt.close();
}
catch (SQLException err)
{
cStmt = null;
}
}
try
{
if (conn != null && conn.isClosed() == false)
conn.close();
}
catch (SQLException err)
{
conn = null;
}
}
}
public static void main(String[] args)
{
new TestClass();
}
}
Suggested fix:
Work around:
Don't use , in defining JDBC called stored procedure parameters. For example, DECIMAL(18) instead of DECIMAL(18,0).
Fix:
On line 6836 of com.mysql.jdbc.DatabaseMetaData the statement for parsing the parameter list is "List parseList = StringUtils.split(parameterDef, ",", true);". Since this is the problem this needs to be modified. Either add some intelligence to the argument parsing or change how the parameter list is retrieved.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.062 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: When calling a stored procedure with datatype Decimal(m,d) (i.e. Decimal(18,0)) the Connector/J library throws the exception below. After looking into the code it appears that the getCallStmtParameterTypes method does not expect that a parameter datatype could include a comma. Therefore, any stored procedure created with a compound datatype: Float(M,D), Decimal(M,D), etc... will have this problem. Error Message: java.sql.SQLException: Internal error when parsing callable statement metadata (missing parameter type) at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:6902) Error in JDBC sampling: java.sql.SQLException: Internal error when parsing callable statement metadata (missing parameter type) at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:2653) at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:1042) at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:83) at com.mysql.jdbc.Connection.prepareCall(Connection.java:1248) at com.mysql.jdbc.Connection.prepareCall(Connection.java:1225) at TestCallableStatement.<init>(TestCallableStatement.java:34) at TestCallableStatement.main(TestCallableStatement.java:112) How to repeat: Create Stored Procedure: DELIMITER // DROP PROCEDURE IF EXISTS TEST_PROC// CREATE PROCEDURE TEST_PROC(decimalParam DECIMAL(18,0)) BEGIN SELECT param_list FROM mysql.proc WHERE name='TEST_PROC'; END // Create Java / JDBC Program to call Stored Procedure import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.CallableStatement; public class TestClass { public TestClass() { Connection conn = null; CallableStatement cStmt = null; try { // Load class Class.forName("com.mysql.jdbc.Driver"); // Modify URL with correct user, pass, host, and db name conn = DriverManager.getConnection("jdbc:mysql://<HOST>/<DB>?user=<USER>&password=<PASS>"); cStmt = conn.prepareCall("Call TEST_PROC(?)"); cStmt.setDouble(1, 18.0); cStmt.execute(); } catch (Exception ex) { System.out.println("Error: " + ex); ex.printStackTrace(); } finally { if (cStmt != null) { try { cStmt.close(); } catch (SQLException err) { cStmt = null; } } try { if (conn != null && conn.isClosed() == false) conn.close(); } catch (SQLException err) { conn = null; } } } public static void main(String[] args) { new TestClass(); } } Suggested fix: Work around: Don't use , in defining JDBC called stored procedure parameters. For example, DECIMAL(18) instead of DECIMAL(18,0). Fix: On line 6836 of com.mysql.jdbc.DatabaseMetaData the statement for parsing the parameter list is "List parseList = StringUtils.split(parameterDef, ",", true);". Since this is the problem this needs to be modified. Either add some intelligence to the argument parsing or change how the parameter list is retrieved.