From 7277dd6386bdd69dc19470c7ba388f01d3f61f04 Mon Sep 17 00:00:00 2001 From: jurgen Date: Sun, 27 Sep 2015 20:22:13 +0000 Subject: [PATCH] Stored procedures metadata read fix. 3.5.0 announcements. Former-commit-id: be324aff2f4cd3742195f41290086fc6226cdf09 --- .../jdbc/exec/JDBCCallableStatementImpl.java | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCCallableStatementImpl.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCCallableStatementImpl.java index 09f7919a40..06cddbf74b 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCCallableStatementImpl.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/exec/JDBCCallableStatementImpl.java @@ -55,14 +55,30 @@ public class JDBCCallableStatementImpl extends JDBCPreparedStatementImpl impleme boolean disableLogging) { super(connection, original, query, disableLogging); - // Try to bind parameters + + // Find procedure definition + try { + procedure = DBUtils.findProcedure(connection, query); + } catch (DBException e) { + log.debug(e); + } + + // Bind procedure parameters try { - DBSProcedure procedure = DBUtils.findProcedure(connection, query); - if (procedure != null) { - bindProcedure(procedure); + ParameterMetaData paramsMeta = original.getParameterMetaData(); + if (paramsMeta != null) { + bindProcedureFromJDBC(paramsMeta); } } catch (Exception e) { log.debug(e); + // Try to bind parameters from procedure meta info + try { + if (procedure != null) { + bindProcedureFromMeta(); + } + } catch (Exception e1) { + log.debug(e1); + } } } @@ -76,9 +92,26 @@ public class JDBCCallableStatementImpl extends JDBCPreparedStatementImpl impleme // Procedure bindings //////////////////////////////////////////////////////////////////// + void bindProcedureFromJDBC(@NotNull ParameterMetaData paramsMeta) throws DBException { + try { + int parameterCount = paramsMeta.getParameterCount(); + if (parameterCount > 0) { + for (int index = 0; index < parameterCount; index++) { + int parameterMode = paramsMeta.getParameterMode(index + 1); + if (parameterMode == ParameterMetaData.parameterModeOut || parameterMode == ParameterMetaData.parameterModeInOut) { + registerOutParameter(index + 1, paramsMeta.getParameterType(index + 1)); + } + } + } + } catch (SQLException e) { + throw new DBException("Error binding callable statement parameters from metadata", e); + } + } - void bindProcedure(@NotNull DBSProcedure procedure) throws DBException { - this.procedure = procedure; + void bindProcedureFromMeta() throws DBException { + if (procedure == null) { + return; + } try { Collection params = procedure.getParameters(getConnection().getProgressMonitor()); if (!CommonUtils.isEmpty(params)) { -- GitLab