diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallParameterMetaData.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallParameterMetaData.java index 53eae9163422..76d9cec68f4e 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallParameterMetaData.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallParameterMetaData.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,25 +30,39 @@ */ public class CallParameterMetaData { + private final boolean function; + @Nullable - private String parameterName; + private final String parameterName; - private int parameterType; + private final int parameterType; - private int sqlType; + private final int sqlType; @Nullable - private String typeName; + private final String typeName; - private boolean nullable; + private final boolean nullable; /** - * Constructor taking all the properties. + * Constructor taking all the properties except the function marker. */ + @Deprecated public CallParameterMetaData( @Nullable String columnName, int columnType, int sqlType, @Nullable String typeName, boolean nullable) { + this(false, columnName, columnType, sqlType, typeName, nullable); + } + + /** + * Constructor taking all the properties including the function marker. + * @since 5.2.9 + */ + public CallParameterMetaData(boolean function, @Nullable String columnName, int columnType, + int sqlType, @Nullable String typeName, boolean nullable) { + + this.function = function; this.parameterName = columnName; this.parameterType = columnType; this.sqlType = sqlType; @@ -58,7 +72,15 @@ public CallParameterMetaData( /** - * Get the parameter name. + * Return whether this parameter is declared in a function. + * @since 5.2.9 + */ + public boolean isFunction() { + return this.function; + } + + /** + * Return the parameter name. */ @Nullable public String getParameterName() { @@ -66,7 +88,7 @@ public String getParameterName() { } /** - * Get the parameter type. + * Return the parameter type. */ public int getParameterType() { return this.parameterType; @@ -75,23 +97,25 @@ public int getParameterType() { /** * Determine whether the declared parameter qualifies as a 'return' parameter * for our purposes: type {@link DatabaseMetaData#procedureColumnReturn} or - * {@link DatabaseMetaData#procedureColumnResult}. + * {@link DatabaseMetaData#procedureColumnResult}, or in case of a function, + * {@link DatabaseMetaData#functionReturn}. * @since 4.3.15 */ public boolean isReturnParameter() { - return (this.parameterType == DatabaseMetaData.procedureColumnReturn || - this.parameterType == DatabaseMetaData.procedureColumnResult); + return (this.function ? this.parameterType == DatabaseMetaData.functionReturn : + (this.parameterType == DatabaseMetaData.procedureColumnReturn || + this.parameterType == DatabaseMetaData.procedureColumnResult)); } /** - * Get the parameter SQL type. + * Return the parameter SQL type. */ public int getSqlType() { return this.sqlType; } /** - * Get the parameter type name. + * Return the parameter type name. */ @Nullable public String getTypeName() { @@ -99,7 +123,7 @@ public String getTypeName() { } /** - * Get whether the parameter is nullable. + * Return whether the parameter is nullable. */ public boolean isNullable() { return this.nullable; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java index ef4ef9a81839..f0b6991f6825 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java @@ -399,7 +399,7 @@ else if ("Oracle".equals(databaseMetaData.getDatabaseProductName())) { } else { int nullable = (function ? DatabaseMetaData.functionNullable : DatabaseMetaData.procedureNullable); - CallParameterMetaData meta = new CallParameterMetaData(columnName, columnType, + CallParameterMetaData meta = new CallParameterMetaData(function, columnName, columnType, columns.getInt("DATA_TYPE"), columns.getString("TYPE_NAME"), columns.getInt("NULLABLE") == nullable); this.callParameterMetaData.add(meta);