blob: 92d0e3d09977638199c3e200361b93eeadb24422 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.sql.Date;
import java.sql.Statement;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import org.mariadb.jdbc.client.result.Result;
import org.mariadb.jdbc.codec.Parameter;
import org.mariadb.jdbc.export.ExceptionFactory;
import org.mariadb.jdbc.util.ParameterList;
/** Common methods for function/stored procedure */
public abstract class BaseCallableStatement extends ServerPreparedStatement
implements CallableStatement {
/** Database name */
protected final String databaseName;
/** Procedure name */
protected final String procedureName;
/** parameter metadata */
protected CallableParameterMetaData parameterMetaData = null;
/** Declared output parameters */
protected final Set<Integer> outputParameters = new HashSet<>();
/** output parameter result */
private Result outputResult = null;
/**
* Constructor
*
* @param sql sql command
* @param con connection
* @param lock thread safe lock
* @param databaseName database name
* @param procedureName procedure name
* @param canUseServerTimeout indicate if server support server timeout
* @param canUseServerMaxRows indicate if server support server max rows
* @param canCachePrepStmts can cache server prepared result
* @param resultSetType resultset type
* @param resultSetConcurrency resultset concurrency
* @param defaultFetchSize default fetch size
* @throws SQLException if prepare fails
*/
public BaseCallableStatement(
String sql,
Connection con,
ReentrantLock lock,
String databaseName,
String procedureName,
boolean canUseServerTimeout,
boolean canUseServerMaxRows,
boolean canCachePrepStmts,
int resultSetType,
int resultSetConcurrency,
int defaultFetchSize)
throws SQLException {
super(
sql,
con,
lock,
canUseServerTimeout,
canUseServerMaxRows,
canCachePrepStmts,
Statement.RETURN_GENERATED_KEYS,
resultSetType,
resultSetConcurrency,
defaultFetchSize);
this.databaseName = databaseName;
this.procedureName = procedureName;
}
/**
* Indicate if callable statement is a function or a stored procedure
*
* @return indicate if is a function
*/
public abstract boolean isFunction();
/**
* Output result without output parameters
*
* @param i index
* @throws SQLException if any exception
*/
protected void outputResultFromRes(int i) throws SQLException {
this.outputResult = (Result) this.results.remove(this.results.size() - i);
this.outputResult.next();
}
/**
* Registers the OUT parameter in ordinal position <code>parameterIndex</code> to the JDBC type
* <code>sqlType</code>. All OUT parameters must be registered before a stored procedure is
* executed.
*
* <p>The JDBC type specified by <code>sqlType</code> for an OUT parameter determines the Java
* type that must be used in the <code>get</code> method to read the value of that parameter.
*
* <p>If the JDBC type expected to be returned to this output parameter is specific to this
* particular database, <code>sqlType</code> should be <code>java.sql.Types.OTHER</code>. The
* method {@link #getObject} retrieves the value.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param sqlType the JDBC type code defined by <code>java.sql.Types</code>. If the parameter is
* of JDBC type <code>NUMERIC</code> or <code>DECIMAL</code>, the version of <code>
* registerOutParameter</code> that accepts a scale value should be used.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if <code>sqlType</code> is a <code>ARRAY</code>, <code>
* BLOB</code>, <code>CLOB</code>, <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>
* NCHAR</code>, <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>, <code>
* REF</code>, <code>ROWID</code>, <code>SQLXML</code> or <code>STRUCT</code> data type and
* the JDBC driver does not support this data type
* @see Types
*/
@Override
public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException {
checkIndex(parameterIndex);
outputParameters.add(parameterIndex);
if (!parameters.containsKey(parameterIndex - 1))
parameters.set(parameterIndex - 1, Parameter.NULL_PARAMETER);
}
private void checkIndex(int index) throws SQLException {
if (index <= 0
|| (prepareResult != null
&& index > (prepareResult.getParameters().length + (isFunction() ? 1 : 0)))
|| (prepareResult == null
&& parameterMetaData != null
&& index > parameterMetaData.getParameterCount())) {
throw exceptionFactory().create(String.format("wrong parameter index %s", index));
}
}
/**
* Registers the parameter in ordinal position <code>parameterIndex</code> to be of JDBC type
* <code>sqlType</code>. All OUT parameters must be registered before a stored procedure is
* executed.
*
* <p>The JDBC type specified by <code>sqlType</code> for an OUT parameter determines the Java
* type that must be used in the <code>get</code> method to read the value of that parameter.
*
* <p>This version of <code>registerOutParameter</code> should be used when the parameter is of
* JDBC type <code>NUMERIC</code> or <code>DECIMAL</code>.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param sqlType the SQL type code defined by <code>java.sql.Types</code>.
* @param scale the desired number of digits to the right of the decimal point. It must be greater
* than or equal to zero.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if <code>sqlType</code> is a <code>ARRAY</code>, <code>
* BLOB</code>, <code>CLOB</code>, <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>
* NCHAR</code>, <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>, <code>
* REF</code>, <code>ROWID</code>, <code>SQLXML</code> or <code>STRUCT</code> data type and
* the JDBC driver does not support this data type
* @see Types
*/
@Override
public void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException {
registerOutParameter(parameterIndex, sqlType);
}
@Override
public void clearParameters() throws SQLException {
checkNotClosed();
parameters = new ParameterList();
outputParameters.stream().forEach(index -> parameters.set(index - 1, Parameter.NULL_PARAMETER));
}
/**
* Retrieves whether the last OUT parameter read had the value of SQL <code>NULL</code>. Note that
* this method should be called only after calling a getter method; otherwise, there is no value
* to use in determining whether it is <code>null</code> or not.
*
* @return <code>true</code> if the last parameter read was SQL <code>NULL</code>; <code>false
* </code> otherwise
* @throws SQLException if a database access error occurs or this method is called on a closed
* <code>CallableStatement</code>
*/
@Override
public boolean wasNull() throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.wasNull();
}
private int idxToOutIdx(int idx) throws SQLException {
int outputIndex = 1;
if (idx < 1) throw exceptionFactory().create(String.format("wrong index %s", idx));
if (!outputParameters.contains(idx))
throw exceptionFactory().create(String.format("index %s not declared as output", idx));
for (int i = 1; i < idx; i++) {
if (outputParameters.contains(i)) outputIndex++;
}
return outputIndex;
}
/**
* Check if statement is closed, and throw exception if so.
*
* @throws SQLException if statement close
*/
protected void checkOutputResult() throws SQLException {
if (outputResult == null) {
throw exceptionFactory().create("No output result");
}
}
/**
* Retrieves the value of the designated JDBC <code>CHAR</code>, <code>VARCHAR</code>, or <code>
* LONGVARCHAR</code> parameter as a <code>String</code> in the Java programming language.
*
* <p>For the fixed-length type JDBC <code>CHAR</code>, the <code>String</code> object returned
* has exactly the same value the SQL <code>CHAR</code> value had in the database, including any
* padding added by the database.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setString
*/
@Override
public String getString(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getString(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>BIT</code> or <code>BOOLEAN</code> parameter
* as a <code>boolean</code> in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>false
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setBoolean
*/
@Override
public boolean getBoolean(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getBoolean(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>TINYINT</code> parameter as a <code>byte
* </code> in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setByte
*/
@Override
public byte getByte(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getByte(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>SMALLINT</code> parameter as a <code>short
* </code> in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setShort
*/
@Override
public short getShort(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getShort(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>INTEGER</code> parameter as an <code>int
* </code> in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setInt
*/
@Override
public int getInt(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getInt(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>BIGINT</code> parameter as a <code>long</code>
* in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setLong
*/
@Override
public long getLong(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getLong(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>FLOAT</code> parameter as a <code>float</code>
* in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setFloat
*/
@Override
public float getFloat(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getFloat(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>DOUBLE</code> parameter as a <code>double
* </code> in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setDouble
*/
@Override
public double getDouble(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getDouble(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>NUMERIC</code> parameter as a <code>
* java.math.BigDecimal</code> object with <i>scale</i> digits to the right of the decimal point.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param scale the number of digits to the right of the decimal point
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setBigDecimal
* @deprecated use <code>getBigDecimal(int parameterIndex)</code> or <code>
* getBigDecimal(String parameterName)</code>
*/
@Override
@Deprecated
public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getBigDecimal(idxToOutIdx(parameterIndex), scale);
}
/**
* Retrieves the value of the designated JDBC <code>BINARY</code> or <code>VARBINARY</code>
* parameter as an array of <code>byte</code> values in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setBytes
*/
@Override
public byte[] getBytes(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getBytes(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>DATE</code> parameter as a <code>java.sql.Date
* </code> object.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setDate
*/
@Override
public Date getDate(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getDate(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>TIME</code> parameter as a <code>java.sql.Time
* </code> object.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setTime
*/
@Override
public Time getTime(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getTime(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>TIMESTAMP</code> parameter as a <code>
* java.sql.Timestamp</code> object.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setTimestamp
*/
@Override
public Timestamp getTimestamp(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getTimestamp(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated parameter as an <code>Object</code> in the Java
* programming language. If the value is an SQL <code>NULL</code>, the driver returns a Java
* <code>null</code>.
*
* <p>This method returns a Java object whose type corresponds to the JDBC type that was
* registered for this parameter using the method <code>registerOutParameter</code>. By
* registering the target JDBC types as <code>java.sql.Types.OTHER</code>, this method can be used
* to read database-specific abstract data types.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return A <code>java.lang.Object</code> holding the OUT parameter value
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see Types
* @see #setObject
*/
@Override
public Object getObject(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getObject(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>NUMERIC</code> parameter as a <code>
* java.math.BigDecimal</code> object with as many digits to the right of the decimal point as the
* value contains.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value in full precision. If the value is SQL <code>NULL</code>, the
* result is <code>null</code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setBigDecimal
* @since 1.2
*/
@Override
public BigDecimal getBigDecimal(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getBigDecimal(idxToOutIdx(parameterIndex));
}
/**
* Returns an object representing the value of OUT parameter <code>parameterIndex</code> and uses
* <code>map</code> for the custom mapping of the parameter value.
*
* <p>This method returns a Java object whose type corresponds to the JDBC type that was
* registered for this parameter using the method <code>registerOutParameter</code>. By
* registering the target JDBC types as <code>java.sql.Types.OTHER</code>, this method can be used
* to read database-specific abstract data types.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param map the mapping from SQL type names to Java classes
* @return a <code>java.lang.Object</code> holding the OUT parameter value
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setObject
* @since 1.2
*/
@Override
public Object getObject(int parameterIndex, Map<String, Class<?>> map) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getObject(idxToOutIdx(parameterIndex), map);
}
/**
* Retrieves the value of the designated JDBC <code>REF(&lt;structured-type&gt;)</code> parameter
* as a {@link Ref} object in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value as a <code>Ref</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.2
*/
@Override
public Ref getRef(int parameterIndex) throws SQLException {
throw exceptionFactory().notSupported("Method ResultSet.getRef not supported");
}
/**
* Retrieves the value of the designated JDBC <code>BLOB</code> parameter as a {@link Blob} object
* in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value as a <code>Blob</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.2
*/
@Override
public Blob getBlob(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getBlob(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>CLOB</code> parameter as a <code>java.sql.Clob
* </code> object in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value as a <code>Clob</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.2
*/
@Override
public Clob getClob(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getClob(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>ARRAY</code> parameter as an {@link Array}
* object in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value as an <code>Array</code> object in the Java programming language.
* If the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.2
*/
@Override
public Array getArray(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
throw exceptionFactory().notSupported("Method ResultSet.getArray not supported");
}
/**
* Retrieves the value of the designated JDBC <code>DATE</code> parameter as a <code>java.sql.Date
* </code> object, using the given <code>Calendar</code> object to construct the date. With a
* <code>Calendar</code> object, the driver can calculate the date taking into account a custom
* timezone and locale. If no <code>Calendar</code> object is specified, the driver uses the
* default timezone and locale.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param cal the <code>Calendar</code> object the driver will use to construct the date
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setDate
* @since 1.2
*/
@Override
public Date getDate(int parameterIndex, Calendar cal) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getDate(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>TIME</code> parameter as a <code>java.sql.Time
* </code> object, using the given <code>Calendar</code> object to construct the time. With a
* <code>Calendar</code> object, the driver can calculate the time taking into account a custom
* timezone and locale. If no <code>Calendar</code> object is specified, the driver uses the
* default timezone and locale.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param cal the <code>Calendar</code> object the driver will use to construct the time
* @return the parameter value; if the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setTime
* @since 1.2
*/
@Override
public Time getTime(int parameterIndex, Calendar cal) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getTime(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated JDBC <code>TIMESTAMP</code> parameter as a <code>
* java.sql.Timestamp</code> object, using the given <code>Calendar</code> object to construct the
* <code>Timestamp</code> object. With a <code>Calendar</code> object, the driver can calculate
* the timestamp taking into account a custom timezone and locale. If no <code>Calendar</code>
* object is specified, the driver uses the default timezone and locale.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param cal the <code>Calendar</code> object the driver will use to construct the timestamp
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @see #setTimestamp
* @since 1.2
*/
@Override
public Timestamp getTimestamp(int parameterIndex, Calendar cal) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getTimestamp(idxToOutIdx(parameterIndex));
}
/**
* Registers the designated output parameter. This version of the method <code>
* registerOutParameter</code> should be used for a user-defined or <code>REF</code> output
* parameter. Examples of user-defined types include: <code>STRUCT</code>, <code>DISTINCT</code>,
* <code>JAVA_OBJECT</code>, and named array types.
*
* <p>All OUT parameters must be registered before a stored procedure is executed.
*
* <p>For a user-defined parameter, the fully-qualified SQL type name of the parameter should also
* be given, while a <code>REF</code> parameter requires that the fully-qualified type name of the
* referenced type be given. A JDBC driver that does not need the type code and type name
* information may ignore it. To be portable, however, applications should always provide these
* values for user-defined and <code>REF</code> parameters.
*
* <p>Although it is intended for user-defined and <code>REF</code> parameters, this method may be
* used to register a parameter of any JDBC type. If the parameter does not have a user-defined or
* <code>REF</code> type, the <i>typeName</i> parameter is ignored.
*
* <p><B>Note:</B> When reading the value of an out parameter, you must use the getter method
* whose Java type corresponds to the parameter's registered SQL type.
*
* @param parameterIndex the first parameter is 1, the second is 2,...
* @param sqlType a value from {@link Types}
* @param typeName the fully-qualified name of an SQL structured type
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if <code>sqlType</code> is a <code>ARRAY</code>, <code>
* BLOB</code>, <code>CLOB</code>, <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>
* NCHAR</code>, <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>, <code>
* REF</code>, <code>ROWID</code>, <code>SQLXML</code> or <code>STRUCT</code> data type and
* the JDBC driver does not support this data type
* @see Types
* @since 1.2
*/
@Override
public void registerOutParameter(int parameterIndex, int sqlType, String typeName)
throws SQLException {
registerOutParameter(parameterIndex, sqlType);
}
/**
* Registers the OUT parameter named <code>parameterName</code> to the JDBC type <code>sqlType
* </code>. All OUT parameters must be registered before a stored procedure is executed.
*
* <p>The JDBC type specified by <code>sqlType</code> for an OUT parameter determines the Java
* type that must be used in the <code>get</code> method to read the value of that parameter.
*
* <p>If the JDBC type expected to be returned to this output parameter is specific to this
* particular database, <code>sqlType</code> should be <code>java.sql.Types.OTHER</code>. The
* method {@link #getObject} retrieves the value.
*
* @param parameterName the name of the parameter
* @param sqlType the JDBC type code defined by <code>java.sql.Types</code>. If the parameter is
* of JDBC type <code>NUMERIC</code> or <code>DECIMAL</code>, the version of <code>
* registerOutParameter</code> that accepts a scale value should be used.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if <code>sqlType</code> is a <code>ARRAY</code>, <code>
* BLOB</code>, <code>CLOB</code>, <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>
* NCHAR</code>, <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>, <code>
* REF</code>, <code>ROWID</code>, <code>SQLXML</code> or <code>STRUCT</code> data type and
* the JDBC driver does not support this data type or if the JDBC driver does not support this
* method
* @see Types
* @since 1.4
*/
@Override
public void registerOutParameter(String parameterName, int sqlType) throws SQLException {
checkNotClosed();
registerOutParameter(nameToIndex(parameterName), sqlType);
}
private int nameToIndex(String parameterName) throws SQLException {
if (parameterName == null) throw exceptionFactory().create("parameter name cannot be null");
if (parameterMetaData == null) parameterMetaData = getParameterMetaData();
int count = parameterMetaData.getParameterCount();
for (int i = 1; i <= count; i++) {
String name = parameterMetaData.getParameterName(i);
if (name != null && name.equalsIgnoreCase(parameterName)) {
return i;
}
}
throw exceptionFactory().create(String.format("parameter name %s not found", parameterName));
}
/**
* Registers the parameter named <code>parameterName</code> to be of JDBC type <code>sqlType
* </code>. All OUT parameters must be registered before a stored procedure is executed.
*
* <p>The JDBC type specified by <code>sqlType</code> for an OUT parameter determines the Java
* type that must be used in the <code>get</code> method to read the value of that parameter.
*
* <p>This version of <code>registerOutParameter</code> should be used when the parameter is of
* JDBC type <code>NUMERIC</code> or <code>DECIMAL</code>.
*
* @param parameterName the name of the parameter
* @param sqlType SQL type code defined by <code>java.sql.Types</code>.
* @param scale the desired number of digits to the right of the decimal point. It must be greater
* than or equal to zero.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if <code>sqlType</code> is a <code>ARRAY</code>, <code>
* BLOB</code>, <code>CLOB</code>, <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>
* NCHAR</code>, <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>, <code>
* REF</code>, <code>ROWID</code>, <code>SQLXML</code> or <code>STRUCT</code> data type and
* the JDBC driver does not support this data type or if the JDBC driver does not support this
* method
* @see Types
* @since 1.4
*/
@Override
public void registerOutParameter(String parameterName, int sqlType, int scale)
throws SQLException {
registerOutParameter(parameterName, sqlType);
}
/**
* Registers the designated output parameter. This version of the method <code>
* registerOutParameter</code> should be used for a user-named or REF output parameter. Examples
* of user-named types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.
*
* <p>All OUT parameters must be registered before a stored procedure is executed.
*
* <p>For a user-named parameter the fully-qualified SQL type name of the parameter should also be
* given, while a REF parameter requires that the fully-qualified type name of the referenced type
* be given. A JDBC driver that does not need the type code and type name information may ignore
* it. To be portable, however, applications should always provide these values for user-named and
* REF parameters.
*
* <p>Although it is intended for user-named and REF parameters, this method may be used to
* register a parameter of any JDBC type. If the parameter does not have a user-named or REF type,
* the typeName parameter is ignored.
*
* <p><B>Note:</B> When reading the value of an out parameter, you must use the <code>getXXX
* </code> method whose Java type XXX corresponds to the parameter's registered SQL type.
*
* @param parameterName the name of the parameter
* @param sqlType a value from {@link Types}
* @param typeName the fully-qualified name of an SQL structured type
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if <code>sqlType</code> is a <code>ARRAY</code>, <code>
* BLOB</code>, <code>CLOB</code>, <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>
* NCHAR</code>, <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>, <code>
* REF</code>, <code>ROWID</code>, <code>SQLXML</code> or <code>STRUCT</code> data type and
* the JDBC driver does not support this data type or if the JDBC driver does not support this
* method
* @see Types
* @since 1.4
*/
@Override
public void registerOutParameter(String parameterName, int sqlType, String typeName)
throws SQLException {
registerOutParameter(parameterName, sqlType);
}
/**
* Retrieves the value of the designated JDBC <code>DATALINK</code> parameter as a <code>
* java.net.URL</code> object.
*
* @param parameterIndex the first parameter is 1, the second is 2,...
* @return a <code>java.net.URL</code> object that represents the JDBC <code>DATALINK</code> value
* used as the designated parameter
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs,
* this method is called on a closed <code>CallableStatement</code>, or if the URL being
* returned is not a valid URL on the Java platform
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setURL
* @since 1.4
*/
@Override
public URL getURL(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getURL(idxToOutIdx(parameterIndex));
}
/**
* Sets the designated parameter to the given <code>java.net.URL</code> object. The driver
* converts this to an SQL <code>DATALINK</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param val the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs; this method is called on a closed <code>CallableStatement</code> or if
* a URL is malformed
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getURL
* @since 1.4
*/
@Override
public void setURL(String parameterName, URL val) throws SQLException {
setURL(nameToIndex(parameterName), val);
}
/**
* Sets the designated parameter to SQL <code>NULL</code>.
*
* <p><B>Note:</B> You must specify the parameter's SQL type.
*
* @param parameterName the name of the parameter
* @param sqlType the SQL type code defined in <code>java.sql.Types</code>
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public void setNull(String parameterName, int sqlType) throws SQLException {
setNull(nameToIndex(parameterName), sqlType);
}
/**
* Sets the designated parameter to the given Java <code>boolean</code> value. The driver converts
* this to an SQL <code>BIT</code> or <code>BOOLEAN</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getBoolean
* @since 1.4
*/
@Override
public void setBoolean(String parameterName, boolean x) throws SQLException {
setBoolean(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>byte</code> value. The driver converts
* this to an SQL <code>TINYINT</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getByte
* @since 1.4
*/
@Override
public void setByte(String parameterName, byte x) throws SQLException {
setByte(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>short</code> value. The driver converts
* this to an SQL <code>SMALLINT</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getShort
* @since 1.4
*/
@Override
public void setShort(String parameterName, short x) throws SQLException {
setShort(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>int</code> value. The driver converts
* this to an SQL <code>INTEGER</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getInt
* @since 1.4
*/
@Override
public void setInt(String parameterName, int x) throws SQLException {
setInt(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>long</code> value. The driver converts
* this to an SQL <code>BIGINT</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getLong
* @since 1.4
*/
@Override
public void setLong(String parameterName, long x) throws SQLException {
setLong(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>float</code> value. The driver converts
* this to an SQL <code>FLOAT</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getFloat
* @since 1.4
*/
@Override
public void setFloat(String parameterName, float x) throws SQLException {
setFloat(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>double</code> value. The driver converts
* this to an SQL <code>DOUBLE</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getDouble
* @since 1.4
*/
@Override
public void setDouble(String parameterName, double x) throws SQLException {
setDouble(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>java.math.BigDecimal</code> value. The driver
* converts this to an SQL <code>NUMERIC</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getBigDecimal
* @since 1.4
*/
@Override
public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException {
setBigDecimal(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java <code>String</code> value. The driver converts
* this to an SQL <code>VARCHAR</code> or <code>LONGVARCHAR</code> value (depending on the
* argument's size relative to the driver's limits on <code>VARCHAR</code> values) when it sends
* it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getString
* @since 1.4
*/
@Override
public void setString(String parameterName, String x) throws SQLException {
setString(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given Java array of bytes. The driver converts this to an
* SQL <code>VARBINARY</code> or <code>LONGVARBINARY</code> (depending on the argument's size
* relative to the driver's limits on <code>VARBINARY</code> values) when it sends it to the
* database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getBytes
* @since 1.4
*/
@Override
public void setBytes(String parameterName, byte[] x) throws SQLException {
setBytes(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>java.sql.Date</code> value using the default
* time zone of the virtual machine that is running the application. The driver converts this to
* an SQL <code>DATE</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getDate
* @since 1.4
*/
@Override
public void setDate(String parameterName, Date x) throws SQLException {
setDate(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>java.sql.Time</code> value. The driver
* converts this to an SQL <code>TIME</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getTime
* @since 1.4
*/
@Override
public void setTime(String parameterName, Time x) throws SQLException {
setTime(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>java.sql.Timestamp</code> value. The driver
* converts this to an SQL <code>TIMESTAMP</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getTimestamp
* @since 1.4
*/
@Override
public void setTimestamp(String parameterName, Timestamp x) throws SQLException {
setTimestamp(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given input stream, which will have the specified number
* of bytes. When a very large ASCII value is input to a <code>LONGVARCHAR</code> parameter, it
* may be more practical to send it via a <code>java.io.InputStream</code>. Data will be read from
* the stream as needed until end-of-file is reached. The JDBC driver will do any necessary
* conversion from ASCII to the database char format.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* @param parameterName the name of the parameter
* @param x the Java input stream that contains the ASCII parameter value
* @param length the number of bytes in the stream
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public void setAsciiStream(String parameterName, InputStream x, int length) throws SQLException {
setAsciiStream(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given input stream, which will have the specified number
* of bytes. When a very large binary value is input to a <code>LONGVARBINARY</code> parameter, it
* may be more practical to send it via a <code>java.io.InputStream</code> object. The data will
* be read from the stream as needed until end-of-file is reached.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* @param parameterName the name of the parameter
* @param x the java input stream which contains the binary parameter value
* @param length the number of bytes in the stream
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public void setBinaryStream(String parameterName, InputStream x, int length) throws SQLException {
setBinaryStream(nameToIndex(parameterName), x, length);
}
/**
* Sets the value of the designated parameter with the given object.
*
* <p>The given Java object will be converted to the given targetSqlType before being sent to the
* database.
*
* <p>If the object has a custom mapping (is of a class implementing the interface <code>SQLData
* </code>), the JDBC driver should call the method <code>SQLData.writeSQL</code> to write it to
* the SQL data stream. If, on the other hand, the object is of a class implementing <code>Ref
* </code>, <code>Blob</code>, <code>Clob</code>, <code>NClob</code>, <code>Struct</code>, <code>
* java.net.URL</code>, or <code>Array</code>, the driver should pass it to the database as a
* value of the corresponding SQL type.
*
* <p>Note that this method may be used to pass datatabase- specific abstract data types.
*
* @param parameterName the name of the parameter
* @param x the object containing the input parameter value
* @param targetSqlType the SQL type (as defined in java.sql.Types) to be sent to the database.
* The scale argument may further qualify this type.
* @param scale for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types, this is the number of
* digits after the decimal point. For all other types, this value will be ignored.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* targetSqlType
* @see Types
* @see #getObject
* @since 1.4
*/
@Override
public void setObject(String parameterName, Object x, int targetSqlType, int scale)
throws SQLException {
setObject(nameToIndex(parameterName), x);
}
/**
* Sets the value of the designated parameter with the given object.
*
* <p>This method is similar to {@link #setObject(String parameterName, Object x, int
* targetSqlType, int scaleOrLength)}, except that it assumes a scale of zero.
*
* @param parameterName the name of the parameter
* @param x the object containing the input parameter value
* @param targetSqlType the SQL type (as defined in java.sql.Types) to be sent to the database
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* targetSqlType
* @see #getObject
* @since 1.4
*/
@Override
public void setObject(String parameterName, Object x, int targetSqlType) throws SQLException {
setObject(nameToIndex(parameterName), x);
}
/**
* Sets the value of the designated parameter with the given object.
*
* <p>The JDBC specification specifies a standard mapping from Java <code>Object</code> types to
* SQL types. The given argument will be converted to the corresponding SQL type before being sent
* to the database.
*
* <p>Note that this method may be used to pass database- specific abstract data types, by using a
* driver-specific Java type.
*
* <p>If the object is of a class implementing the interface <code>SQLData</code>, the JDBC driver
* should call the method <code>SQLData.writeSQL</code> to write it to the SQL data stream. If, on
* the other hand, the object is of a class implementing <code>Ref</code>, <code>Blob</code>,
* <code>Clob</code>, <code>NClob</code>, <code>Struct</code>, <code>java.net.URL</code>, or
* <code>Array</code>, the driver should pass it to the database as a value of the corresponding
* SQL type.
*
* <p>This method throws an exception if there is an ambiguity, for example, if the object is of a
* class implementing more than one of the interfaces named above.
*
* <p><b>Note:</b> Not all databases allow for a non-typed Null to be sent to the backend. For
* maximum portability, the <code>setNull</code> or the <code>
* setObject(String parameterName, Object x, int sqlType)</code> method should be used instead of
* <code>setObject(String parameterName, Object x)</code>.
*
* @param parameterName the name of the parameter
* @param x the object containing the input parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs, this method is called on a closed <code>CallableStatement</code> or if
* the given <code>Object</code> parameter is ambiguous
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getObject
* @since 1.4
*/
@Override
public void setObject(String parameterName, Object x) throws SQLException {
setObject(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>Reader</code> object, which is the given
* number of characters long. When a very large UNICODE value is input to a <code>LONGVARCHAR
* </code> parameter, it may be more practical to send it via a <code>java.io.Reader</code>
* object. The data will be read from the stream as needed until end-of-file is reached. The JDBC
* driver will do any necessary conversion from UNICODE to the database char format.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* @param parameterName the name of the parameter
* @param reader the <code>java.io.Reader</code> object that contains the UNICODE data used as the
* designated parameter
* @param length the number of characters in the stream
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public void setCharacterStream(String parameterName, Reader reader, int length)
throws SQLException {
setCharacterStream(nameToIndex(parameterName), reader, length);
}
/**
* Sets the designated parameter to the given <code>java.sql.Date</code> value, using the given
* <code>Calendar</code> object. The driver uses the <code>Calendar</code> object to construct an
* SQL <code>DATE</code> value, which the driver then sends to the database. With a a <code>
* Calendar</code> object, the driver can calculate the date taking into account a custom
* timezone. If no <code>Calendar</code> object is specified, the driver uses the default
* timezone, which is that of the virtual machine running the application.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @param cal the <code>Calendar</code> object the driver will use to construct the date
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getDate
* @since 1.4
*/
@Override
public void setDate(String parameterName, Date x, Calendar cal) throws SQLException {
setDate(nameToIndex(parameterName), x, cal);
}
/**
* Sets the designated parameter to the given <code>java.sql.Time</code> value, using the given
* <code>Calendar</code> object. The driver uses the <code>Calendar</code> object to construct an
* SQL <code>TIME</code> value, which the driver then sends to the database. With a a <code>
* Calendar</code> object, the driver can calculate the time taking into account a custom
* timezone. If no <code>Calendar</code> object is specified, the driver uses the default
* timezone, which is that of the virtual machine running the application.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @param cal the <code>Calendar</code> object the driver will use to construct the time
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getTime
* @since 1.4
*/
@Override
public void setTime(String parameterName, Time x, Calendar cal) throws SQLException {
setTime(nameToIndex(parameterName), x, cal);
}
/**
* Sets the designated parameter to the given <code>java.sql.Timestamp</code> value, using the
* given <code>Calendar</code> object. The driver uses the <code>Calendar</code> object to
* construct an SQL <code>TIMESTAMP</code> value, which the driver then sends to the database.
* With a a <code>Calendar</code> object, the driver can calculate the timestamp taking into
* account a custom timezone. If no <code>Calendar</code> object is specified, the driver uses the
* default timezone, which is that of the virtual machine running the application.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @param cal the <code>Calendar</code> object the driver will use to construct the timestamp
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #getTimestamp
* @since 1.4
*/
@Override
public void setTimestamp(String parameterName, Timestamp x, Calendar cal) throws SQLException {
setTimestamp(nameToIndex(parameterName), x, cal);
}
/**
* Sets the designated parameter to SQL <code>NULL</code>. This version of the method <code>
* setNull</code> should be used for user-defined types and REF type parameters. Examples of
* user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.
*
* <p><B>Note:</B> To be portable, applications must give the SQL type code and the
* fully-qualified SQL type name when specifying a NULL user-defined or REF parameter. In the case
* of a user-defined type the name is the type name of the parameter itself. For a REF parameter,
* the name is the type name of the referenced type.
*
* <p>Although it is intended for user-defined and Ref parameters, this method may be used to set
* a null parameter of any JDBC type. If the parameter does not have a user-defined or REF type,
* the given typeName is ignored.
*
* @param parameterName the name of the parameter
* @param sqlType a value from <code>java.sql.Types</code>
* @param typeName the fully-qualified name of an SQL user-defined type; ignored if the parameter
* is not a user-defined type or SQL <code>REF</code> value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public void setNull(String parameterName, int sqlType, String typeName) throws SQLException {
setNull(nameToIndex(parameterName), sqlType, typeName);
}
/**
* Retrieves the value of a JDBC <code>CHAR</code>, <code>VARCHAR</code>, or <code>LONGVARCHAR
* </code> parameter as a <code>String</code> in the Java programming language.
*
* <p>For the fixed-length type JDBC <code>CHAR</code>, the <code>String</code> object returned
* has exactly the same value the SQL <code>CHAR</code> value had in the database, including any
* padding added by the database.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setString
* @since 1.4
*/
@Override
public String getString(String parameterName) throws SQLException {
return outputResult.getString(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>BIT</code> or <code>BOOLEAN</code> parameter as a <code>
* boolean</code> in the Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>false
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setBoolean
* @since 1.4
*/
@Override
public boolean getBoolean(String parameterName) throws SQLException {
return outputResult.getBoolean(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>TINYINT</code> parameter as a <code>byte</code> in the Java
* programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setByte
* @since 1.4
*/
@Override
public byte getByte(String parameterName) throws SQLException {
return outputResult.getByte(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>SMALLINT</code> parameter as a <code>short</code> in the
* Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setShort
* @since 1.4
*/
@Override
public short getShort(String parameterName) throws SQLException {
return outputResult.getShort(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>INTEGER</code> parameter as an <code>int</code> in the Java
* programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setInt
* @since 1.4
*/
@Override
public int getInt(String parameterName) throws SQLException {
return outputResult.getInt(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>BIGINT</code> parameter as a <code>long</code> in the Java
* programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setLong
* @since 1.4
*/
@Override
public long getLong(String parameterName) throws SQLException {
return outputResult.getLong(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>FLOAT</code> parameter as a <code>float</code> in the Java
* programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setFloat
* @since 1.4
*/
@Override
public float getFloat(String parameterName) throws SQLException {
return outputResult.getFloat(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>DOUBLE</code> parameter as a <code>double</code> in the
* Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>0
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setDouble
* @since 1.4
*/
@Override
public double getDouble(String parameterName) throws SQLException {
return outputResult.getDouble(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>BINARY</code> or <code>VARBINARY</code> parameter as an
* array of <code>byte</code> values in the Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setBytes
* @since 1.4
*/
@Override
public byte[] getBytes(String parameterName) throws SQLException {
return outputResult.getBytes(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>DATE</code> parameter as a <code>java.sql.Date</code>
* object.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setDate
* @since 1.4
*/
@Override
public Date getDate(String parameterName) throws SQLException {
return outputResult.getDate(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>TIME</code> parameter as a <code>java.sql.Time</code>
* object.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setTime
* @since 1.4
*/
@Override
public Time getTime(String parameterName) throws SQLException {
return outputResult.getTime(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>TIMESTAMP</code> parameter as a <code>java.sql.Timestamp
* </code> object.
*
* @param parameterName the name of the parameter
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setTimestamp
* @since 1.4
*/
@Override
public Timestamp getTimestamp(String parameterName) throws SQLException {
return outputResult.getTimestamp(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a parameter as an <code>Object</code> in the Java programming language.
* If the value is an SQL <code>NULL</code>, the driver returns a Java <code>null</code>.
*
* <p>This method returns a Java object whose type corresponds to the JDBC type that was
* registered for this parameter using the method <code>registerOutParameter</code>. By
* registering the target JDBC types as <code>java.sql.Types.OTHER</code>, this method can be used
* to read database-specific abstract data types.
*
* @param parameterName the name of the parameter
* @return A <code>java.lang.Object</code> holding the OUT parameter value.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see Types
* @see #setObject
* @since 1.4
*/
@Override
public Object getObject(String parameterName) throws SQLException {
return outputResult.getObject(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>NUMERIC</code> parameter as a <code>java.math.BigDecimal
* </code> object with as many digits to the right of the decimal point as the value contains.
*
* @param parameterName the name of the parameter
* @return the parameter value in full precision. If the value is SQL <code>NULL</code>, the
* result is <code>null</code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setBigDecimal
* @since 1.4
*/
@Override
public BigDecimal getBigDecimal(String parameterName) throws SQLException {
return outputResult.getBigDecimal(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Returns an object representing the value of OUT parameter <code>parameterName</code> and uses
* <code>map</code> for the custom mapping of the parameter value.
*
* <p>This method returns a Java object whose type corresponds to the JDBC type that was
* registered for this parameter using the method <code>registerOutParameter</code>. By
* registering the target JDBC types as <code>java.sql.Types.OTHER</code>, this method can be used
* to read database-specific abstract data types.
*
* @param parameterName the name of the parameter
* @param map the mapping from SQL type names to Java classes
* @return a <code>java.lang.Object</code> holding the OUT parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setObject
* @since 1.4
*/
@Override
public Object getObject(String parameterName, Map<String, Class<?>> map) throws SQLException {
return outputResult.getObject(idxToOutIdx(nameToIndex(parameterName)), map);
}
/**
* Retrieves the value of a JDBC <code>REF(&lt;structured-type&gt;)</code> parameter as a {@link
* Ref} object in the Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value as a <code>Ref</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public Ref getRef(String parameterName) throws SQLException {
throw exceptionFactory().notSupported("Method ResultSet.getRef not supported");
}
/**
* Retrieves the value of a JDBC <code>BLOB</code> parameter as a {@link Blob} object in the Java
* programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value as a <code>Blob</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public Blob getBlob(String parameterName) throws SQLException {
return outputResult.getBlob(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>CLOB</code> parameter as a <code>java.sql.Clob</code>
* object in the Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value as a <code>Clob</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public Clob getClob(String parameterName) throws SQLException {
return outputResult.getClob(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of a JDBC <code>ARRAY</code> parameter as an {@link Array} object in the
* Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value as an <code>Array</code> object in Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.4
*/
@Override
public Array getArray(String parameterName) throws SQLException {
throw exceptionFactory().notSupported("Method ResultSet.getArray not supported");
}
/**
* Retrieves the value of a JDBC <code>DATE</code> parameter as a <code>java.sql.Date</code>
* object, using the given <code>Calendar</code> object to construct the date. With a <code>
* Calendar</code> object, the driver can calculate the date taking into account a custom timezone
* and locale. If no <code>Calendar</code> object is specified, the driver uses the default
* timezone and locale.
*
* @param parameterName the name of the parameter
* @param cal the <code>Calendar</code> object the driver will use to construct the date
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setDate
* @since 1.4
*/
@Override
public Date getDate(String parameterName, Calendar cal) throws SQLException {
return outputResult.getDate(idxToOutIdx(nameToIndex(parameterName)), cal);
}
/**
* Retrieves the value of a JDBC <code>TIME</code> parameter as a <code>java.sql.Time</code>
* object, using the given <code>Calendar</code> object to construct the time. With a <code>
* Calendar</code> object, the driver can calculate the time taking into account a custom timezone
* and locale. If no <code>Calendar</code> object is specified, the driver uses the default
* timezone and locale.
*
* @param parameterName the name of the parameter
* @param cal the <code>Calendar</code> object the driver will use to construct the time
* @return the parameter value; if the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setTime
* @since 1.4
*/
@Override
public Time getTime(String parameterName, Calendar cal) throws SQLException {
return outputResult.getTime(idxToOutIdx(nameToIndex(parameterName)), cal);
}
/**
* Retrieves the value of a JDBC <code>TIMESTAMP</code> parameter as a <code>java.sql.Timestamp
* </code> object, using the given <code>Calendar</code> object to construct the <code>Timestamp
* </code> object. With a <code>Calendar</code> object, the driver can calculate the timestamp
* taking into account a custom timezone and locale. If no <code>Calendar</code> object is
* specified, the driver uses the default timezone and locale.
*
* @param parameterName the name of the parameter
* @param cal the <code>Calendar</code> object the driver will use to construct the timestamp
* @return the parameter value. If the value is SQL <code>NULL</code>, the result is <code>null
* </code>.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setTimestamp
* @since 1.4
*/
@Override
public Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLException {
return outputResult.getTimestamp(idxToOutIdx(nameToIndex(parameterName)), cal);
}
/**
* Retrieves the value of a JDBC <code>DATALINK</code> parameter as a <code>java.net.URL</code>
* object.
*
* @param parameterName the name of the parameter
* @return the parameter value as a <code>java.net.URL</code> object in the Java programming
* language. If the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs, this method is called on a closed <code>CallableStatement</code>, or
* if there is a problem with the URL
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setURL
* @since 1.4
*/
@Override
public URL getURL(String parameterName) throws SQLException {
return outputResult.getURL(idxToOutIdx(nameToIndex(parameterName)));
}
/**
* Retrieves the value of the designated JDBC <code>ROWID</code> parameter as a <code>
* java.sql.RowId</code> object.
*
* @param parameterIndex the first parameter is 1, the second is 2,...
* @return a <code>RowId</code> object that represents the JDBC <code>ROWID</code> value is used
* as the designated parameter. If the parameter contains an SQL <code>NULL</code>, then a
* <code>null</code> value is returned.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public RowId getRowId(int parameterIndex) throws SQLException {
throw exceptionFactory().notSupported("RowId are not supported");
}
/**
* Retrieves the value of the designated JDBC <code>ROWID</code> parameter as a <code>
* java.sql.RowId</code> object.
*
* @param parameterName the name of the parameter
* @return a <code>RowId</code> object that represents the JDBC <code>ROWID</code> value is used
* as the designated parameter. If the parameter contains an SQL <code>NULL</code>, then a
* <code>null</code> value is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public RowId getRowId(String parameterName) throws SQLException {
throw exceptionFactory().notSupported("RowId are not supported");
}
/**
* Sets the designated parameter to the given <code>java.sql.RowId</code> object. The driver
* converts this to an SQL <code>ROWID</code> when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setRowId(String parameterName, RowId x) throws SQLException {
throw exceptionFactory().notSupported("RowId parameter are not supported");
}
/**
* Sets the designated parameter to the given <code>String</code> object. The driver converts this
* to an SQL <code>NCHAR</code> or <code>NVARCHAR</code> or <code>LONGNVARCHAR</code>
*
* @param parameterName the name of the parameter to be set
* @param value the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if the driver
* does not support national character sets; if the driver can detect that a data conversion
* error could occur; if a database access error occurs or this method is called on a closed
* <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setNString(String parameterName, String value) throws SQLException {
setNString(nameToIndex(parameterName), value);
}
/**
* Sets the designated parameter to a <code>Reader</code> object. The <code>Reader</code> reads
* the data till end-of-file is reached. The driver does the necessary conversion from Java
* character format to the national character set in the database.
*
* @param parameterName the name of the parameter to be set
* @param value the parameter value
* @param length the number of characters in the parameter data.
* @throws SQLException if parameterName does not correspond to a named parameter; if the driver
* does not support national character sets; if the driver can detect that a data conversion
* error could occur; if a database access error occurs or this method is called on a closed
* <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setNCharacterStream(String parameterName, Reader value, long length)
throws SQLException {
setNCharacterStream(nameToIndex(parameterName), value, length);
}
/**
* Sets the designated parameter to a <code>java.sql.NClob</code> object. The object implements
* the <code>java.sql.NClob</code> interface. This <code>NClob</code> object maps to an SQL <code>
* NCLOB</code>.
*
* @param parameterName the name of the parameter to be set
* @param value the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if the driver
* does not support national character sets; if the driver can detect that a data conversion
* error could occur; if a database access error occurs or this method is called on a closed
* <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setNClob(String parameterName, NClob value) throws SQLException {
setNClob(nameToIndex(parameterName), value);
}
/**
* Sets the designated parameter to a <code>Reader</code> object. The <code>reader</code> must
* contain the number of characters specified by length otherwise a <code>SQLException</code> will
* be generated when the <code>CallableStatement</code> is executed. This method differs from the
* <code>setCharacterStream (int, Reader, int)</code> method because it informs the driver that
* the parameter value should be sent to the server as a <code>CLOB</code>. When the <code>
* setCharacterStream</code> method is used, the driver may have to do extra work to determine
* whether the parameter data should be sent to the server as a <code>LONGVARCHAR</code> or a
* <code>CLOB</code>
*
* @param parameterName the name of the parameter to be set
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @throws SQLException if parameterName does not correspond to a named parameter; if the length
* specified is less than zero; a database access error occurs or this method is called on a
* closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setClob(String parameterName, Reader reader, long length) throws SQLException {
setClob(nameToIndex(parameterName), reader, length);
}
/**
* Sets the designated parameter to an {@code InputStream} object. The <code>Inputstream</code>
* must contain the number of characters specified by length, otherwise a <code>SQLException
* </code> will be generated when the <code>CallableStatement</code> is executed. This method
* differs from the <code>setBinaryStream (int, InputStream, int)</code> method because it informs
* the driver that the parameter value should be sent to the server as a <code>BLOB</code>. When
* the <code>setBinaryStream</code> method is used, the driver may have to do extra work to
* determine whether the parameter data should be sent to the server as a <code>LONGVARBINARY
* </code> or a <code>BLOB</code>
*
* @param parameterName the name of the parameter to be set the second is 2, ...
* @param inputStream An object that contains the data to set the parameter value to.
* @param length the number of bytes in the parameter data.
* @throws SQLException if parameterName does not correspond to a named parameter; if the length
* specified is less than zero; if the number of bytes in the {@code InputStream} does not
* match the specified length; if a database access error occurs or this method is called on a
* closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setBlob(String parameterName, InputStream inputStream, long length)
throws SQLException {
setBlob(nameToIndex(parameterName), inputStream, length);
}
/**
* Sets the designated parameter to a <code>Reader</code> object. The <code>reader</code> must
* contain the number of characters specified by length otherwise a <code>SQLException</code> will
* be generated when the <code>CallableStatement</code> is executed. This method differs from the
* <code>setCharacterStream (int, Reader, int)</code> method because it informs the driver that
* the parameter value should be sent to the server as a <code>NCLOB</code>. When the <code>
* setCharacterStream</code> method is used, the driver may have to do extra work to determine
* whether the parameter data should be sent to the server as a <code>LONGNVARCHAR</code> or a
* <code>NCLOB</code>
*
* @param parameterName the name of the parameter to be set
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @throws SQLException if parameterName does not correspond to a named parameter; if the length
* specified is less than zero; if the driver does not support national character sets; if the
* driver can detect that a data conversion error could occur; if a database access error
* occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setNClob(String parameterName, Reader reader, long length) throws SQLException {
setNClob(nameToIndex(parameterName), reader, length);
}
/**
* Retrieves the value of the designated JDBC <code>NCLOB</code> parameter as a <code>
* java.sql.NClob</code> object in the Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @return the parameter value as a <code>NClob</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if the parameterIndex is not valid; if the driver does not support
* national character sets; if the driver can detect that a data conversion error could occur;
* if a database access error occurs or this method is called on a closed <code>
* CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public NClob getNClob(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getNClob(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of a JDBC <code>NCLOB</code> parameter as a <code>java.sql.NClob</code>
* object in the Java programming language.
*
* @param parameterName the name of the parameter
* @return the parameter value as a <code>NClob</code> object in the Java programming language. If
* the value was SQL <code>NULL</code>, the value <code>null</code> is returned.
* @throws SQLException if parameterName does not correspond to a named parameter; if the driver
* does not support national character sets; if the driver can detect that a data conversion
* error could occur; if a database access error occurs or this method is called on a closed
* <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public NClob getNClob(String parameterName) throws SQLException {
return getNClob(nameToIndex(parameterName));
}
/**
* Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver
* converts this to an <code>SQL XML</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param xmlObject a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs; this method is called on a closed <code>CallableStatement</code> or
* the <code>java.xml.transform.Result</code>, <code>Writer</code> or <code>OutputStream
* </code> has not been closed for the <code>SQLXML</code> object
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setSQLXML(String parameterName, SQLXML xmlObject) throws SQLException {
throw exceptionFactory().notSupported("SQLXML parameter are not supported");
}
/**
* Retrieves the value of the designated <code>SQL XML</code> parameter as a <code>java.sql.SQLXML
* </code> object in the Java programming language.
*
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
* @return a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public SQLXML getSQLXML(int parameterIndex) throws SQLException {
throw exceptionFactory().notSupported("SQLXML are not supported");
}
/**
* Retrieves the value of the designated <code>SQL XML</code> parameter as a <code>java.sql.SQLXML
* </code> object in the Java programming language.
*
* @param parameterName the name of the parameter
* @return a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public SQLXML getSQLXML(String parameterName) throws SQLException {
throw exceptionFactory().notSupported("SQLXML are not supported");
}
private ExceptionFactory exceptionFactory() {
return con.getExceptionFactory().of(this);
}
/**
* Retrieves the value of the designated <code>NCHAR</code>, <code>NVARCHAR</code> or <code>
* LONGNVARCHAR</code> parameter as a <code>String</code> in the Java programming language.
*
* <p>For the fixed-length type JDBC <code>NCHAR</code>, the <code>String</code> object returned
* has exactly the same value the SQL <code>NCHAR</code> value had in the database, including any
* padding added by the database.
*
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
* @return a <code>String</code> object that maps an <code>NCHAR</code>, <code>NVARCHAR</code> or
* <code>LONGNVARCHAR</code> value
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setNString
* @since 1.6
*/
@Override
public String getNString(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getNString(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated <code>NCHAR</code>, <code>NVARCHAR</code> or <code>
* LONGNVARCHAR</code> parameter as a <code>String</code> in the Java programming language.
*
* <p>For the fixed-length type JDBC <code>NCHAR</code>, the <code>String</code> object returned
* has exactly the same value the SQL <code>NCHAR</code> value had in the database, including any
* padding added by the database.
*
* @param parameterName the name of the parameter
* @return a <code>String</code> object that maps an <code>NCHAR</code>, <code>NVARCHAR</code> or
* <code>LONGNVARCHAR</code> value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @see #setNString
* @since 1.6
*/
@Override
public String getNString(String parameterName) throws SQLException {
return getNString(nameToIndex(parameterName));
}
/**
* Retrieves the value of the designated parameter as a <code>java.io.Reader</code> object in the
* Java programming language. It is intended for use when accessing <code>NCHAR</code>,<code>
* NVARCHAR</code> and <code>LONGNVARCHAR</code> parameters.
*
* @param parameterIndex the first parameter is 1, the second is 2, ...
* @return a <code>java.io.Reader</code> object that contains the parameter value; if the value is
* SQL <code>NULL</code>, the value returned is <code>null</code> in the Java programming
* language.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public Reader getNCharacterStream(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getNCharacterStream(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated parameter as a <code>java.io.Reader</code> object in the
* Java programming language. It is intended for use when accessing <code>NCHAR</code>,<code>
* NVARCHAR</code> and <code>LONGNVARCHAR</code> parameters.
*
* @param parameterName the name of the parameter
* @return a <code>java.io.Reader</code> object that contains the parameter value; if the value is
* SQL <code>NULL</code>, the value returned is <code>null</code> in the Java programming
* language
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public Reader getNCharacterStream(String parameterName) throws SQLException {
return getNCharacterStream(nameToIndex(parameterName));
}
/**
* Retrieves the value of the designated parameter as a <code>java.io.Reader</code> object in the
* Java programming language.
*
* @param parameterIndex the first parameter is 1, the second is 2, ...
* @return a <code>java.io.Reader</code> object that contains the parameter value; if the value is
* SQL <code>NULL</code>, the value returned is <code>null</code> in the Java programming
* language.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed <code>CallableStatement</code>
* @since 1.6
*/
@Override
public Reader getCharacterStream(int parameterIndex) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getCharacterStream(idxToOutIdx(parameterIndex));
}
/**
* Retrieves the value of the designated parameter as a <code>java.io.Reader</code> object in the
* Java programming language.
*
* @param parameterName the name of the parameter
* @return a <code>java.io.Reader</code> object that contains the parameter value; if the value is
* SQL <code>NULL</code>, the value returned is <code>null</code> in the Java programming
* language
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public Reader getCharacterStream(String parameterName) throws SQLException {
return getNCharacterStream(nameToIndex(parameterName));
}
/**
* Sets the designated parameter to the given <code>java.sql.Blob</code> object. The driver
* converts this to an SQL <code>BLOB</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x a <code>Blob</code> object that maps an SQL <code>BLOB</code> value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setBlob(String parameterName, Blob x) throws SQLException {
setBlob(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>java.sql.Clob</code> object. The driver
* converts this to an SQL <code>CLOB</code> value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x a <code>Clob</code> object that maps an SQL <code>CLOB</code> value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setClob(String parameterName, Clob x) throws SQLException {
setClob(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given input stream, which will have the specified number
* of bytes. When a very large ASCII value is input to a <code>LONGVARCHAR</code> parameter, it
* may be more practical to send it via a <code>java.io.InputStream</code>. Data will be read from
* the stream as needed until end-of-file is reached. The JDBC driver will do any necessary
* conversion from ASCII to the database char format.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* @param parameterName the name of the parameter
* @param x the Java input stream that contains the ASCII parameter value
* @param length the number of bytes in the stream
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setAsciiStream(String parameterName, InputStream x, long length) throws SQLException {
setAsciiStream(nameToIndex(parameterName), x, length);
}
/**
* Sets the designated parameter to the given input stream, which will have the specified number
* of bytes. When a very large binary value is input to a <code>LONGVARBINARY</code> parameter, it
* may be more practical to send it via a <code>java.io.InputStream</code> object. The data will
* be read from the stream as needed until end-of-file is reached.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* @param parameterName the name of the parameter
* @param x the java input stream which contains the binary parameter value
* @param length the number of bytes in the stream
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setBinaryStream(String parameterName, InputStream x, long length)
throws SQLException {
setBinaryStream(nameToIndex(parameterName), x, length);
}
/**
* Sets the designated parameter to the given <code>Reader</code> object, which is the given
* number of characters long. When a very large UNICODE value is input to a <code>LONGVARCHAR
* </code> parameter, it may be more practical to send it via a <code>java.io.Reader</code>
* object. The data will be read from the stream as needed until end-of-file is reached. The JDBC
* driver will do any necessary conversion from UNICODE to the database char format.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* @param parameterName the name of the parameter
* @param reader the <code>java.io.Reader</code> object that contains the UNICODE data used as the
* designated parameter
* @param length the number of characters in the stream
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setCharacterStream(String parameterName, Reader reader, long length)
throws SQLException {
setCharacterStream(nameToIndex(parameterName), reader, length);
}
/**
* Sets the designated parameter to the given input stream. When a very large ASCII value is input
* to a <code>LONGVARCHAR</code> parameter, it may be more practical to send it via a <code>
* java.io.InputStream</code>. Data will be read from the stream as needed until end-of-file is
* reached. The JDBC driver will do any necessary conversion from ASCII to the database char
* format.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setAsciiStream</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param x the Java input stream that contains the ASCII parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setAsciiStream(String parameterName, InputStream x) throws SQLException {
setAsciiStream(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given input stream. When a very large binary value is
* input to a <code>LONGVARBINARY</code> parameter, it may be more practical to send it via a
* <code>java.io.InputStream</code> object. The data will be read from the stream as needed until
* end-of-file is reached.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setBinaryStream</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param x the java input stream which contains the binary parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setBinaryStream(String parameterName, InputStream x) throws SQLException {
setBinaryStream(nameToIndex(parameterName), x);
}
/**
* Sets the designated parameter to the given <code>Reader</code> object. When a very large
* UNICODE value is input to a <code>LONGVARCHAR</code> parameter, it may be more practical to
* send it via a <code>java.io.Reader</code> object. The data will be read from the stream as
* needed until end-of-file is reached. The JDBC driver will do any necessary conversion from
* UNICODE to the database char format.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setCharacterStream</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param reader the <code>java.io.Reader</code> object that contains the Unicode data
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setCharacterStream(String parameterName, Reader reader) throws SQLException {
setCharacterStream(nameToIndex(parameterName), reader);
}
/**
* Sets the designated parameter to a <code>Reader</code> object. The <code>Reader</code> reads
* the data till end-of-file is reached. The driver does the necessary conversion from Java
* character format to the national character set in the database.
*
* <p><B>Note:</B> This stream object can either be a standard Java stream object or your own
* subclass that implements the standard interface.
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setNCharacterStream</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param value the parameter value
* @throws SQLException if parameterName does not correspond to a named parameter; if the driver
* does not support national character sets; if the driver can detect that a data conversion
* error could occur; if a database access error occurs; or this method is called on a closed
* <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setNCharacterStream(String parameterName, Reader value) throws SQLException {
setNCharacterStream(nameToIndex(parameterName), value);
}
/**
* Sets the designated parameter to a <code>Reader</code> object. This method differs from the
* <code>setCharacterStream (int, Reader)</code> method because it informs the driver that the
* parameter value should be sent to the server as a <code>CLOB</code>. When the <code>
* setCharacterStream</code> method is used, the driver may have to do extra work to determine
* whether the parameter data should be sent to the server as a <code>LONGVARCHAR</code> or a
* <code>CLOB</code>
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setClob</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setClob(String parameterName, Reader reader) throws SQLException {
setClob(nameToIndex(parameterName), reader);
}
/**
* Sets the designated parameter to an {@code InputStream} object. This method differs from the
* <code>setBinaryStream (int, InputStream)</code> method because it informs the driver that the
* parameter value should be sent to the server as a <code>BLOB</code>. When the <code>
* setBinaryStream</code> method is used, the driver may have to do extra work to determine
* whether the parameter data should be sent to the server as a <code>LONGVARBINARY</code> or a
* <code>BLOB</code>
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setBlob</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param inputStream An object that contains the data to set the parameter value to.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setBlob(String parameterName, InputStream inputStream) throws SQLException {
setBlob(nameToIndex(parameterName), inputStream);
}
/**
* Sets the designated parameter to a <code>Reader</code> object. This method differs from the
* <code>setCharacterStream (int, Reader)</code> method because it informs the driver that the
* parameter value should be sent to the server as a <code>NCLOB</code>. When the <code>
* setCharacterStream</code> method is used, the driver may have to do extra work to determine
* whether the parameter data should be sent to the server as a <code>LONGNVARCHAR</code> or a
* <code>NCLOB</code>
*
* <p><B>Note:</B> Consult your JDBC driver documentation to determine if it might be more
* efficient to use a version of <code>setNClob</code> which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if parameterName does not correspond to a named parameter; if the driver
* does not support national character sets; if the driver can detect that a data conversion
* error could occur; if a database access error occurs or this method is called on a closed
* <code>CallableStatement</code>
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@Override
public void setNClob(String parameterName, Reader reader) throws SQLException {
setNClob(nameToIndex(parameterName), reader);
}
/**
* Returns an object representing the value of OUT parameter {@code parameterIndex} and will
* convert from the SQL type of the parameter to the requested Java data type, if the conversion
* is supported. If the conversion is not supported or null is specified for the type, a <code>
* SQLException</code> is thrown.
*
* <p>At a minimum, an implementation must support the conversions defined in Appendix B, Table
* B-3 and conversion of appropriate user defined SQL types to a Java type which implements {@code
* SQLData}, or {@code Struct}. Additional conversions may be supported and are vendor defined.
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param type Class representing the Java data type to convert the designated parameter to.
* @return an instance of {@code type} holding the OUT parameter value
* @throws SQLException if conversion is not supported, type is null or another error occurs. The
* getCause() method of the exception may provide a more detailed exception, for example, if a
* conversion error occurs
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.7
*/
@Override
public <T> T getObject(int parameterIndex, Class<T> type) throws SQLException {
checkNotClosed();
checkOutputResult();
return outputResult.getObject(idxToOutIdx(parameterIndex), type);
}
/**
* Returns an object representing the value of OUT parameter {@code parameterName} and will
* convert from the SQL type of the parameter to the requested Java data type, if the conversion
* is supported. If the conversion is not supported or null is specified for the type, a <code>
* SQLException</code> is thrown.
*
* <p>At a minimum, an implementation must support the conversions defined in Appendix B, Table
* B-3 and conversion of appropriate user defined SQL types to a Java type which implements {@code
* SQLData}, or {@code Struct}. Additional conversions may be supported and are vendor defined.
*
* @param parameterName the name of the parameter
* @param type Class representing the Java data type to convert the designated parameter to.
* @return an instance of {@code type} holding the OUT parameter value
* @throws SQLException if conversion is not supported, type is null or another error occurs. The
* getCause() method of the exception may provide a more detailed exception, for example, if a
* conversion error occurs
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.7
*/
@Override
public <T> T getObject(String parameterName, Class<T> type) throws SQLException {
return getObject(nameToIndex(parameterName), type);
}
/**
* Sets the value of the designated parameter with the given object.
*
* <p>If the second argument is an {@code InputStream} then the stream must contain the number of
* bytes specified by scaleOrLength. If the second argument is a {@code Reader} then the reader
* must contain the number of characters specified by scaleOrLength. If these conditions are not
* true the driver will generate a {@code SQLException} when the prepared statement is executed.
*
* <p>The given Java object will be converted to the given targetSqlType before being sent to the
* database.
*
* <p>If the object has a custom mapping (is of a class implementing the interface {@code
* SQLData}), the JDBC driver should call the method {@code SQLData.writeSQL} to write it to the
* SQL data stream. If, on the other hand, the object is of a class implementing {@code Ref},
* {@code Blob}, {@code Clob}, {@code NClob}, {@code Struct}, {@code java.net.URL}, or {@code
* Array}, the driver should pass it to the database as a value of the corresponding SQL type.
*
* <p>Note that this method may be used to pass database-specific abstract data types.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterName the name of the parameter
* @param x the object containing the input parameter value
* @param targetSqlType the SQL type to be sent to the database. The scale argument may further
* qualify this type.
* @param scaleOrLength for {@code java.sql.JDBCType.DECIMAL} or {@code java.sql.JDBCType.NUMERIC
* types}, this is the number of digits after the decimal point. For Java Object types {@code
* InputStream} and {@code Reader}, this is the length of the data in the stream or reader.
* For all other types, this value will be ignored.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed {@code CallableStatement} or if
* the Java Object specified by x is an InputStream or Reader object and the value of the
* scale parameter is less than zero
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* targetSqlType
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void setObject(String parameterName, Object x, SQLType targetSqlType, int scaleOrLength)
throws SQLException {
setObject(nameToIndex(parameterName), x, targetSqlType, scaleOrLength);
}
/**
* Sets the value of the designated parameter with the given object.
*
* <p>This method is similar to {@link #setObject(String parameterName, Object x, SQLType
* targetSqlType, int scaleOrLength)}, except that it assumes a scale of zero.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterName the name of the parameter
* @param x the object containing the input parameter value
* @param targetSqlType the SQL type to be sent to the database
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* targetSqlType
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void setObject(String parameterName, Object x, SQLType targetSqlType) throws SQLException {
setObject(nameToIndex(parameterName), x, targetSqlType);
}
/**
* Registers the OUT parameter in ordinal position {@code parameterIndex} to the JDBC type {@code
* sqlType}. All OUT parameters must be registered before a stored procedure is executed.
*
* <p>The JDBC type specified by {@code sqlType} for an OUT parameter determines the Java type
* that must be used in the {@code get} method to read the value of that parameter.
*
* <p>If the JDBC type expected to be returned to this output parameter is specific to this
* particular database, {@code sqlType} may be {@code JDBCType.OTHER} or a {@code SQLType} that is
* supported by the JDBC driver. The method {@link #getObject} retrieves the value.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param sqlType the JDBC type code defined by {@code SQLType} to use to register the OUT
* Parameter. If the parameter is of JDBC type {@code JDBCType.NUMERIC} or {@code
* JDBCType.DECIMAL}, the version of {@code registerOutParameter} that accepts a scale value
* should be used.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* sqlType
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void registerOutParameter(int parameterIndex, SQLType sqlType) throws SQLException {
registerOutParameter(parameterIndex, 0);
}
/**
* Registers the parameter in ordinal position {@code parameterIndex} to be of JDBC type {@code
* sqlType}. All OUT parameters must be registered before a stored procedure is executed.
*
* <p>The JDBC type specified by {@code sqlType} for an OUT parameter determines the Java type
* that must be used in the {@code get} method to read the value of that parameter.
*
* <p>This version of {@code registerOutParameter} should be used when the parameter is of JDBC
* type {@code JDBCType.NUMERIC} or {@code JDBCType.DECIMAL}.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterIndex the first parameter is 1, the second is 2, and so on
* @param sqlType the JDBC type code defined by {@code SQLType} to use to register the OUT
* Parameter.
* @param scale the desired number of digits to the right of the decimal point. It must be greater
* than or equal to zero.
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* sqlType
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void registerOutParameter(int parameterIndex, SQLType sqlType, int scale)
throws SQLException {
registerOutParameter(parameterIndex, sqlType);
}
/**
* Registers the designated output parameter. This version of the method {@code
* registerOutParameter} should be used for a user-defined or {@code REF} output parameter.
* Examples of user-defined types include: {@code STRUCT}, {@code DISTINCT}, {@code JAVA_OBJECT},
* and named array types.
*
* <p>All OUT parameters must be registered before a stored procedure is executed.
*
* <p>For a user-defined parameter, the fully-qualified SQL type name of the parameter should also
* be given, while a {@code REF} parameter requires that the fully-qualified type name of the
* referenced type be given. A JDBC driver that does not need the type code and type name
* information may ignore it. To be portable, however, applications should always provide these
* values for user-defined and {@code REF} parameters.
*
* <p>Although it is intended for user-defined and {@code REF} parameters, this method may be used
* to register a parameter of any JDBC type. If the parameter does not have a user-defined or
* {@code REF} type, the <i>typeName</i> parameter is ignored.
*
* <p><B>Note:</B> When reading the value of an out parameter, you must use the getter method
* whose Java type corresponds to the parameter's registered SQL type.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterIndex the first parameter is 1, the second is 2,...
* @param sqlType the JDBC type code defined by {@code SQLType} to use to register the OUT
* Parameter.
* @param typeName the fully-qualified name of an SQL structured type
* @throws SQLException if the parameterIndex is not valid; if a database access error occurs or
* this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* sqlType
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void registerOutParameter(int parameterIndex, SQLType sqlType, String typeName)
throws SQLException {
registerOutParameter(parameterIndex, sqlType);
}
/**
* Registers the OUT parameter named <code>parameterName</code> to the JDBC type {@code sqlType}.
* All OUT parameters must be registered before a stored procedure is executed.
*
* <p>The JDBC type specified by {@code sqlType} for an OUT parameter determines the Java type
* that must be used in the {@code get} method to read the value of that parameter.
*
* <p>If the JDBC type expected to be returned to this output parameter is specific to this
* particular database, {@code sqlType} should be {@code JDBCType.OTHER} or a {@code SQLType} that
* is supported by the JDBC driver. The method {@link #getObject} retrieves the value.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterName the name of the parameter
* @param sqlType the JDBC type code defined by {@code SQLType} to use to register the OUT
* Parameter. If the parameter is of JDBC type {@code JDBCType.NUMERIC} or {@code
* JDBCType.DECIMAL}, the version of {@code registerOutParameter} that accepts a scale value
* should be used.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* sqlType or if the JDBC driver does not support this method
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void registerOutParameter(String parameterName, SQLType sqlType) throws SQLException {
registerOutParameter(nameToIndex(parameterName), sqlType);
}
/**
* Registers the parameter named <code>parameterName</code> to be of JDBC type {@code sqlType}.
* All OUT parameters must be registered before a stored procedure is executed.
*
* <p>The JDBC type specified by {@code sqlType} for an OUT parameter determines the Java type
* that must be used in the {@code get} method to read the value of that parameter.
*
* <p>This version of {@code registerOutParameter} should be used when the parameter is of JDBC
* type {@code JDBCType.NUMERIC} or {@code JDBCType.DECIMAL}.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterName the name of the parameter
* @param sqlType the JDBC type code defined by {@code SQLType} to use to register the OUT
* Parameter.
* @param scale the desired number of digits to the right of the decimal point. It must be greater
* than or equal to zero.
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* sqlType or if the JDBC driver does not support this method
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void registerOutParameter(String parameterName, SQLType sqlType, int scale)
throws SQLException {
registerOutParameter(nameToIndex(parameterName), sqlType);
}
/**
* Registers the designated output parameter. This version of the method {@code
* registerOutParameter} should be used for a user-named or REF output parameter. Examples of
* user-named types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.
*
* <p>All OUT parameters must be registered before a stored procedure is executed. For a
* user-named parameter the fully-qualified SQL type name of the parameter should also be given,
* while a REF parameter requires that the fully-qualified type name of the referenced type be
* given. A JDBC driver that does not need the type code and type name information may ignore it.
* To be portable, however, applications should always provide these values for user-named and REF
* parameters.
*
* <p>Although it is intended for user-named and REF parameters, this method may be used to
* register a parameter of any JDBC type. If the parameter does not have a user-named or REF type,
* the typeName parameter is ignored.
*
* <p><B>Note:</B> When reading the value of an out parameter, you must use the {@code getXXX}
* method whose Java type XXX corresponds to the parameter's registered SQL type.
*
* <p>The default implementation will throw {@code SQLFeatureNotSupportedException}
*
* @param parameterName the name of the parameter
* @param sqlType the JDBC type code defined by {@code SQLType} to use to register the OUT
* Parameter.
* @param typeName the fully-qualified name of an SQL structured type
* @throws SQLException if parameterName does not correspond to a named parameter; if a database
* access error occurs or this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support the specified
* sqlType or if the JDBC driver does not support this method
* @see JDBCType
* @see SQLType
* @since 1.8
*/
@Override
public void registerOutParameter(String parameterName, SQLType sqlType, String typeName)
throws SQLException {
registerOutParameter(nameToIndex(parameterName), sqlType);
}
@Override
public CallableParameterMetaData getParameterMetaData() throws SQLException {
PreparedStatement prep =
new ClientPreparedStatement(
"SELECT * from information_schema.PARAMETERS "
+ "WHERE SPECIFIC_NAME = ? "
+ "AND SPECIFIC_SCHEMA = ? "
+ "ORDER BY ORDINAL_POSITION",
con,
lock,
false,
false,
Statement.NO_GENERATED_KEYS,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
0);
prep.setString(1, procedureName);
prep.setString(2, databaseName);
ResultSet rs = prep.executeQuery();
parameterMetaData = new CallableParameterMetaData(rs, isFunction());
return parameterMetaData;
}
}