Skip to content

Commit cc06183

Browse files
committed
SimpleJdbcCall reliably throws exception on missing stored procedure
Issue: SPR-13669
1 parent 43d72e2 commit cc06183

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -75,31 +75,31 @@ public void initializeWithMetaData(DatabaseMetaData databaseMetaData) throws SQL
7575
}
7676
catch (SQLException ex) {
7777
if (logger.isWarnEnabled()) {
78-
logger.warn("Error retrieving 'DatabaseMetaData.supportsCatalogsInProcedureCalls' - " + ex.getMessage());
78+
logger.warn("Error retrieving 'DatabaseMetaData.supportsCatalogsInProcedureCalls': " + ex.getMessage());
7979
}
8080
}
8181
try {
8282
setSupportsSchemasInProcedureCalls(databaseMetaData.supportsSchemasInProcedureCalls());
8383
}
8484
catch (SQLException ex) {
8585
if (logger.isWarnEnabled()) {
86-
logger.warn("Error retrieving 'DatabaseMetaData.supportsSchemasInProcedureCalls' - " + ex.getMessage());
86+
logger.warn("Error retrieving 'DatabaseMetaData.supportsSchemasInProcedureCalls': " + ex.getMessage());
8787
}
8888
}
8989
try {
9090
setStoresUpperCaseIdentifiers(databaseMetaData.storesUpperCaseIdentifiers());
9191
}
9292
catch (SQLException ex) {
9393
if (logger.isWarnEnabled()) {
94-
logger.warn("Error retrieving 'DatabaseMetaData.storesUpperCaseIdentifiers' - " + ex.getMessage());
94+
logger.warn("Error retrieving 'DatabaseMetaData.storesUpperCaseIdentifiers': " + ex.getMessage());
9595
}
9696
}
9797
try {
9898
setStoresLowerCaseIdentifiers(databaseMetaData.storesLowerCaseIdentifiers());
9999
}
100100
catch (SQLException ex) {
101101
if (logger.isWarnEnabled()) {
102-
logger.warn("Error retrieving 'DatabaseMetaData.storesLowerCaseIdentifiers' - " + ex.getMessage());
102+
logger.warn("Error retrieving 'DatabaseMetaData.storesLowerCaseIdentifiers': " + ex.getMessage());
103103
}
104104
}
105105
}
@@ -309,15 +309,18 @@ protected boolean isStoresLowerCaseIdentifiers() {
309309
/**
310310
* Process the procedure column metadata
311311
*/
312-
private void processProcedureColumns(DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) {
313-
ResultSet procs = null;
312+
private void processProcedureColumns(
313+
DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) {
314+
314315
String metaDataCatalogName = metaDataCatalogNameToUse(catalogName);
315316
String metaDataSchemaName = metaDataSchemaNameToUse(schemaName);
316317
String metaDataProcedureName = procedureNameToUse(procedureName);
317318
if (logger.isDebugEnabled()) {
318319
logger.debug("Retrieving metadata for " + metaDataCatalogName + "/" +
319320
metaDataSchemaName + "/" + metaDataProcedureName);
320321
}
322+
323+
ResultSet procs = null;
321324
try {
322325
procs = databaseMetaData.getProcedures(metaDataCatalogName, metaDataSchemaName, metaDataProcedureName);
323326
List<String> found = new ArrayList<String>();
@@ -326,16 +329,24 @@ private void processProcedureColumns(DatabaseMetaData databaseMetaData, String c
326329
"." + procs.getString("PROCEDURE_NAME"));
327330
}
328331
procs.close();
332+
329333
if (found.size() > 1) {
330-
throw new InvalidDataAccessApiUsageException("Unable to determine the correct call signature - " +
331-
"multiple procedures/functions/signatures for " + metaDataProcedureName + " found " + found);
334+
throw new InvalidDataAccessApiUsageException(
335+
"Unable to determine the correct call signature - multiple " +
336+
"procedures/functions/signatures for '" + metaDataProcedureName + "': found " + found);
332337
}
333-
if (found.size() < 1) {
338+
else if (found.isEmpty()) {
334339
if (metaDataProcedureName.contains(".") && !StringUtils.hasText(metaDataCatalogName)) {
335340
String packageName = metaDataProcedureName.substring(0, metaDataProcedureName.indexOf("."));
336-
throw new InvalidDataAccessApiUsageException("Unable to determine the correct call signature for " +
337-
metaDataProcedureName + " - package name should be specified separately using " +
338-
"'.withCatalogName(\"" + packageName + "\")'");
341+
throw new InvalidDataAccessApiUsageException(
342+
"Unable to determine the correct call signature for '" + metaDataProcedureName +
343+
"' - package name should be specified separately using '.withCatalogName(\"" +
344+
packageName + "\")'");
345+
}
346+
else {
347+
throw new InvalidDataAccessApiUsageException(
348+
"Unable to determine the correct call signature - no " +
349+
"procedure/function/signature for '" + metaDataProcedureName + "'");
339350
}
340351
}
341352

0 commit comments

Comments
 (0)