1 /*
   2  * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.sql;
  27 
  28 import java.math.BigDecimal;
  29 import java.util.Calendar;
  30 import java.io.Reader;
  31 import java.io.InputStream;
  32 
  33 /**
  34  * An object that represents a precompiled SQL statement.
  35  * <P>A SQL statement is precompiled and stored in a
  36  * <code>PreparedStatement</code> object. This object can then be used to
  37  * efficiently execute this statement multiple times.
  38  *
  39  * <P><B>Note:</B> The setter methods (<code>setShort</code>, <code>setString</code>,
  40  * and so on) for setting IN parameter values
  41  * must specify types that are compatible with the defined SQL type of
  42  * the input parameter. For instance, if the IN parameter has SQL type
  43  * <code>INTEGER</code>, then the method <code>setInt</code> should be used.
  44  *
  45  * <p>If arbitrary parameter type conversions are required, the method
  46  * <code>setObject</code> should be used with a target SQL type.
  47  * <P>
  48  * In the following example of setting a parameter, <code>con</code> represents
  49  * an active connection:
  50  * <PRE>
  51  *   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
  52  *                                     SET SALARY = ? WHERE ID = ?");
  53  *   pstmt.setBigDecimal(1, 153833.00)
  54  *   pstmt.setInt(2, 110592)
  55  * </PRE>
  56  *
  57  * @see Connection#prepareStatement
  58  * @see ResultSet
  59  */
  60 
  61 public interface PreparedStatement extends Statement {
  62 
  63     /**
  64      * Executes the SQL query in this <code>PreparedStatement</code> object
  65      * and returns the <code>ResultSet</code> object generated by the query.
  66      *
  67      * @return a <code>ResultSet</code> object that contains the data produced by the
  68      *         query; never <code>null</code>
  69      * @exception SQLException if a database access error occurs;
  70      * this method is called on a closed  <code>PreparedStatement</code> or the SQL
  71      *            statement does not return a <code>ResultSet</code> object
  72      * @throws SQLTimeoutException when the driver has determined that the
  73      * timeout value that was specified by the {@code setQueryTimeout}
  74      * method has been exceeded and has at least attempted to cancel
  75      * the currently running {@code Statement}
  76      */
  77     ResultSet executeQuery() throws SQLException;
  78 
  79     /**
  80      * Executes the SQL statement in this <code>PreparedStatement</code> object,
  81      * which must be an SQL Data Manipulation Language (DML) statement, such as <code>INSERT</code>, <code>UPDATE</code> or
  82      * <code>DELETE</code>; or an SQL statement that returns nothing,
  83      * such as a DDL statement.
  84      *
  85      * @return either (1) the row count for SQL Data Manipulation Language (DML) statements
  86      *         or (2) 0 for SQL statements that return nothing
  87      * @exception SQLException if a database access error occurs;
  88      * this method is called on a closed  <code>PreparedStatement</code>
  89      * or the SQL statement returns a <code>ResultSet</code> object
  90      * @throws SQLTimeoutException when the driver has determined that the
  91      * timeout value that was specified by the {@code setQueryTimeout}
  92      * method has been exceeded and has at least attempted to cancel
  93      * the currently running {@code Statement}
  94      */
  95     int executeUpdate() throws SQLException;
  96 
  97     /**
  98      * Sets the designated parameter to SQL <code>NULL</code>.
  99      *
 100      * <P><B>Note:</B> You must specify the parameter's SQL type.
 101      *
 102      * @param parameterIndex the first parameter is 1, the second is 2, ...
 103      * @param sqlType the SQL type code defined in <code>java.sql.Types</code>
 104      * @exception SQLException if parameterIndex does not correspond to a parameter
 105      * marker in the SQL statement; if a database access error occurs or
 106      * this method is called on a closed <code>PreparedStatement</code>
 107      * @exception SQLFeatureNotSupportedException if <code>sqlType</code> is
 108      * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
 109      * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
 110      * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
 111      *  <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
 112      * or  <code>STRUCT</code> data type and the JDBC driver does not support
 113      * this data type
 114      */
 115     void setNull(int parameterIndex, int sqlType) throws SQLException;
 116 
 117     /**
 118      * Sets the designated parameter to the given Java <code>boolean</code> value.
 119      * The driver converts this
 120      * to an SQL <code>BIT</code> or <code>BOOLEAN</code> value when it sends it to the database.
 121      *
 122      * @param parameterIndex the first parameter is 1, the second is 2, ...
 123      * @param x the parameter value
 124      * @exception SQLException if parameterIndex does not correspond to a parameter
 125      * marker in the SQL statement;
 126      * if a database access error occurs or
 127      * this method is called on a closed <code>PreparedStatement</code>
 128      */
 129     void setBoolean(int parameterIndex, boolean x) throws SQLException;
 130 
 131     /**
 132      * Sets the designated parameter to the given Java <code>byte</code> value.
 133      * The driver converts this
 134      * to an SQL <code>TINYINT</code> value when it sends it to the database.
 135      *
 136      * @param parameterIndex the first parameter is 1, the second is 2, ...
 137      * @param x the parameter value
 138      * @exception SQLException if parameterIndex does not correspond to a parameter
 139      * marker in the SQL statement; if a database access error occurs or
 140      * this method is called on a closed <code>PreparedStatement</code>
 141      */
 142     void setByte(int parameterIndex, byte x) throws SQLException;
 143 
 144     /**
 145      * Sets the designated parameter to the given Java <code>short</code> value.
 146      * The driver converts this
 147      * to an SQL <code>SMALLINT</code> value when it sends it to the database.
 148      *
 149      * @param parameterIndex the first parameter is 1, the second is 2, ...
 150      * @param x the parameter value
 151      * @exception SQLException if parameterIndex does not correspond to a parameter
 152      * marker in the SQL statement; if a database access error occurs or
 153      * this method is called on a closed <code>PreparedStatement</code>
 154      */
 155     void setShort(int parameterIndex, short x) throws SQLException;
 156 
 157     /**
 158      * Sets the designated parameter to the given Java <code>int</code> value.
 159      * The driver converts this
 160      * to an SQL <code>INTEGER</code> value when it sends it to the database.
 161      *
 162      * @param parameterIndex the first parameter is 1, the second is 2, ...
 163      * @param x the parameter value
 164      * @exception SQLException if parameterIndex does not correspond to a parameter
 165      * marker in the SQL statement; if a database access error occurs or
 166      * this method is called on a closed <code>PreparedStatement</code>
 167      */
 168     void setInt(int parameterIndex, int x) throws SQLException;
 169 
 170     /**
 171      * Sets the designated parameter to the given Java <code>long</code> value.
 172      * The driver converts this
 173      * to an SQL <code>BIGINT</code> value when it sends it to the database.
 174      *
 175      * @param parameterIndex the first parameter is 1, the second is 2, ...
 176      * @param x the parameter value
 177      * @exception SQLException if parameterIndex does not correspond to a parameter
 178      * marker in the SQL statement; if a database access error occurs or
 179      * this method is called on a closed <code>PreparedStatement</code>
 180      */
 181     void setLong(int parameterIndex, long x) throws SQLException;
 182 
 183     /**
 184      * Sets the designated parameter to the given Java <code>float</code> value.
 185      * The driver converts this
 186      * to an SQL <code>REAL</code> value when it sends it to the database.
 187      *
 188      * @param parameterIndex the first parameter is 1, the second is 2, ...
 189      * @param x the parameter value
 190      * @exception SQLException if parameterIndex does not correspond to a parameter
 191      * marker in the SQL statement; if a database access error occurs or
 192      * this method is called on a closed <code>PreparedStatement</code>
 193      */
 194     void setFloat(int parameterIndex, float x) throws SQLException;
 195 
 196     /**
 197      * Sets the designated parameter to the given Java <code>double</code> value.
 198      * The driver converts this
 199      * to an SQL <code>DOUBLE</code> value when it sends it to the database.
 200      *
 201      * @param parameterIndex the first parameter is 1, the second is 2, ...
 202      * @param x the parameter value
 203      * @exception SQLException if parameterIndex does not correspond to a parameter
 204      * marker in the SQL statement; if a database access error occurs or
 205      * this method is called on a closed <code>PreparedStatement</code>
 206      */
 207     void setDouble(int parameterIndex, double x) throws SQLException;
 208 
 209     /**
 210      * Sets the designated parameter to the given <code>java.math.BigDecimal</code> value.
 211      * The driver converts this to an SQL <code>NUMERIC</code> value when
 212      * it sends it to the database.
 213      *
 214      * @param parameterIndex the first parameter is 1, the second is 2, ...
 215      * @param x the parameter value
 216      * @exception SQLException if parameterIndex does not correspond to a parameter
 217      * marker in the SQL statement; if a database access error occurs or
 218      * this method is called on a closed <code>PreparedStatement</code>
 219      */
 220     void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException;
 221 
 222     /**
 223      * Sets the designated parameter to the given Java <code>String</code> value.
 224      * The driver converts this
 225      * to an SQL <code>VARCHAR</code> or <code>LONGVARCHAR</code> value
 226      * (depending on the argument's
 227      * size relative to the driver's limits on <code>VARCHAR</code> values)
 228      * when it sends it to the database.
 229      *
 230      * @param parameterIndex the first parameter is 1, the second is 2, ...
 231      * @param x the parameter value
 232      * @exception SQLException if parameterIndex does not correspond to a parameter
 233      * marker in the SQL statement; if a database access error occurs or
 234      * this method is called on a closed <code>PreparedStatement</code>
 235      */
 236     void setString(int parameterIndex, String x) throws SQLException;
 237 
 238     /**
 239      * Sets the designated parameter to the given Java array of bytes.  The driver converts
 240      * this to an SQL <code>VARBINARY</code> or <code>LONGVARBINARY</code>
 241      * (depending on the argument's size relative to the driver's limits on
 242      * <code>VARBINARY</code> values) when it sends it to the database.
 243      *
 244      * @param parameterIndex the first parameter is 1, the second is 2, ...
 245      * @param x the parameter value
 246      * @exception SQLException if parameterIndex does not correspond to a parameter
 247      * marker in the SQL statement; if a database access error occurs or
 248      * this method is called on a closed <code>PreparedStatement</code>
 249      */
 250     void setBytes(int parameterIndex, byte x[]) throws SQLException;
 251 
 252     /**
 253      * Sets the designated parameter to the given <code>java.sql.Date</code> value
 254      * using the default time zone of the virtual machine that is running
 255      * the application.
 256      * The driver converts this
 257      * to an SQL <code>DATE</code> value when it sends it to the database.
 258      *
 259      * @param parameterIndex the first parameter is 1, the second is 2, ...
 260      * @param x the parameter value
 261      * @exception SQLException if parameterIndex does not correspond to a parameter
 262      * marker in the SQL statement; if a database access error occurs or
 263      * this method is called on a closed <code>PreparedStatement</code>
 264      */
 265     void setDate(int parameterIndex, java.sql.Date x)
 266             throws SQLException;
 267 
 268     /**
 269      * Sets the designated parameter to the given <code>java.sql.Time</code> value.
 270      * The driver converts this
 271      * to an SQL <code>TIME</code> value when it sends it to the database.
 272      *
 273      * @param parameterIndex the first parameter is 1, the second is 2, ...
 274      * @param x the parameter value
 275      * @exception SQLException if parameterIndex does not correspond to a parameter
 276      * marker in the SQL statement; if a database access error occurs or
 277      * this method is called on a closed <code>PreparedStatement</code>
 278      */
 279     void setTime(int parameterIndex, java.sql.Time x)
 280             throws SQLException;
 281 
 282     /**
 283      * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value.
 284      * The driver
 285      * converts this to an SQL <code>TIMESTAMP</code> value when it sends it to the
 286      * database.
 287      *
 288      * @param parameterIndex the first parameter is 1, the second is 2, ...
 289      * @param x the parameter value
 290      * @exception SQLException if parameterIndex does not correspond to a parameter
 291      * marker in the SQL statement; if a database access error occurs or
 292      * this method is called on a closed <code>PreparedStatement</code>     */
 293     void setTimestamp(int parameterIndex, java.sql.Timestamp x)
 294             throws SQLException;
 295 
 296     /**
 297      * Sets the designated parameter to the given input stream, which will have
 298      * the specified number of bytes.
 299      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
 300      * parameter, it may be more practical to send it via a
 301      * <code>java.io.InputStream</code>. Data will be read from the stream
 302      * as needed until end-of-file is reached.  The JDBC driver will
 303      * do any necessary conversion from ASCII to the database char format.
 304      *
 305      * <P><B>Note:</B> This stream object can either be a standard
 306      * Java stream object or your own subclass that implements the
 307      * standard interface.
 308      *
 309      * @param parameterIndex the first parameter is 1, the second is 2, ...
 310      * @param x the Java input stream that contains the ASCII parameter value
 311      * @param length the number of bytes in the stream
 312      * @exception SQLException if parameterIndex does not correspond to a parameter
 313      * marker in the SQL statement; if a database access error occurs or
 314      * this method is called on a closed <code>PreparedStatement</code>
 315      */
 316     void setAsciiStream(int parameterIndex, java.io.InputStream x, int length)
 317             throws SQLException;
 318 
 319     /**
 320      * Sets the designated parameter to the given input stream, which
 321      * will have the specified number of bytes.
 322      *
 323      * When a very large Unicode value is input to a <code>LONGVARCHAR</code>
 324      * parameter, it may be more practical to send it via a
 325      * <code>java.io.InputStream</code> object. The data will be read from the
 326      * stream as needed until end-of-file is reached.  The JDBC driver will
 327      * do any necessary conversion from Unicode to the database char format.
 328      *
 329      *The byte format of the Unicode stream must be a Java UTF-8, as defined in the
 330      *Java Virtual Machine Specification.
 331      *
 332      * <P><B>Note:</B> This stream object can either be a standard
 333      * Java stream object or your own subclass that implements the
 334      * standard interface.
 335      *
 336      * @param parameterIndex the first parameter is 1, the second is 2, ...
 337      * @param x a <code>java.io.InputStream</code> object that contains the
 338      *        Unicode parameter value
 339      * @param length the number of bytes in the stream
 340      * @exception SQLException if parameterIndex does not correspond to a parameter
 341      * marker in the SQL statement; if a database access error occurs or
 342      * this method is called on a closed <code>PreparedStatement</code>
 343      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
 344      * this method
 345      * @deprecated Use {@code setCharacterStream}
 346      */
 347     @Deprecated
 348     void setUnicodeStream(int parameterIndex, java.io.InputStream x,
 349                           int length) throws SQLException;
 350 
 351     /**
 352      * Sets the designated parameter to the given input stream, which will have
 353      * the specified number of bytes.
 354      * When a very large binary value is input to a <code>LONGVARBINARY</code>
 355      * parameter, it may be more practical to send it via a
 356      * <code>java.io.InputStream</code> object. The data will be read from the
 357      * stream as needed until end-of-file is reached.
 358      *
 359      * <P><B>Note:</B> This stream object can either be a standard
 360      * Java stream object or your own subclass that implements the
 361      * standard interface.
 362      *
 363      * @param parameterIndex the first parameter is 1, the second is 2, ...
 364      * @param x the java input stream which contains the binary parameter value
 365      * @param length the number of bytes in the stream
 366      * @exception SQLException if parameterIndex does not correspond to a parameter
 367      * marker in the SQL statement; if a database access error occurs or
 368      * this method is called on a closed <code>PreparedStatement</code>
 369      */
 370     void setBinaryStream(int parameterIndex, java.io.InputStream x,
 371                          int length) throws SQLException;
 372 
 373     /**
 374      * Clears the current parameter values immediately.
 375      * <P>In general, parameter values remain in force for repeated use of a
 376      * statement. Setting a parameter value automatically clears its
 377      * previous value.  However, in some cases it is useful to immediately
 378      * release the resources used by the current parameter values; this can
 379      * be done by calling the method <code>clearParameters</code>.
 380      *
 381      * @exception SQLException if a database access error occurs or
 382      * this method is called on a closed <code>PreparedStatement</code>
 383      */
 384     void clearParameters() throws SQLException;
 385 
 386     //----------------------------------------------------------------------
 387     // Advanced features:
 388 
 389    /**
 390     * Sets the value of the designated parameter with the given object.
 391     *
 392     * This method is similar to {@link #setObject(int parameterIndex,
 393     * Object x, int targetSqlType, int scaleOrLength)},
 394     * except that it assumes a scale of zero.
 395     *
 396     * @param parameterIndex the first parameter is 1, the second is 2, ...
 397     * @param x the object containing the input parameter value
 398     * @param targetSqlType the SQL type (as defined in java.sql.Types) to be
 399     *                      sent to the database
 400     * @exception SQLException if parameterIndex does not correspond to a parameter
 401     * marker in the SQL statement; if a database access error occurs or this
 402     * method is called on a closed PreparedStatement
 403     * @exception SQLFeatureNotSupportedException if
 404     * the JDBC driver does not support the specified targetSqlType
 405     * @see Types
 406     */
 407     void setObject(int parameterIndex, Object x, int targetSqlType)
 408       throws SQLException;
 409 
 410     /**
 411      * <p>Sets the value of the designated parameter using the given object.
 412      *
 413      * <p>The JDBC specification specifies a standard mapping from
 414      * Java <code>Object</code> types to SQL types.  The given argument
 415      * will be converted to the corresponding SQL type before being
 416      * sent to the database.
 417      *
 418      * <p>Note that this method may be used to pass database-
 419      * specific abstract data types, by using a driver-specific Java
 420      * type.
 421      *
 422      * If the object is of a class implementing the interface <code>SQLData</code>,
 423      * the JDBC driver should call the method <code>SQLData.writeSQL</code>
 424      * to write it to the SQL data stream.
 425      * If, on the other hand, the object is of a class implementing
 426      * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>,  <code>NClob</code>,
 427      *  <code>Struct</code>, <code>java.net.URL</code>, <code>RowId</code>, <code>SQLXML</code>
 428      * or <code>Array</code>, the driver should pass it to the database as a
 429      * value of the corresponding SQL type.
 430      * <P>
 431      *<b>Note:</b> Not all databases allow for a non-typed Null to be sent to
 432      * the backend. For maximum portability, the <code>setNull</code> or the
 433      * <code>setObject(int parameterIndex, Object x, int sqlType)</code>
 434      * method should be used
 435      * instead of <code>setObject(int parameterIndex, Object x)</code>.
 436      *<p>
 437      * <b>Note:</b> This method throws an exception if there is an ambiguity, for example, if the
 438      * object is of a class implementing more than one of the interfaces named above.
 439      *
 440      * @param parameterIndex the first parameter is 1, the second is 2, ...
 441      * @param x the object containing the input parameter value
 442      * @exception SQLException if parameterIndex does not correspond to a parameter
 443      * marker in the SQL statement; if a database access error occurs;
 444      *  this method is called on a closed <code>PreparedStatement</code>
 445      * or the type of the given object is ambiguous
 446      */
 447     void setObject(int parameterIndex, Object x) throws SQLException;
 448 
 449     /**
 450      * Executes the SQL statement in this <code>PreparedStatement</code> object,
 451      * which may be any kind of SQL statement.
 452      * Some prepared statements return multiple results; the <code>execute</code>
 453      * method handles these complex statements as well as the simpler
 454      * form of statements handled by the methods <code>executeQuery</code>
 455      * and <code>executeUpdate</code>.
 456      * <P>
 457      * The <code>execute</code> method returns a <code>boolean</code> to
 458      * indicate the form of the first result.  You must call either the method
 459      * <code>getResultSet</code> or <code>getUpdateCount</code>
 460      * to retrieve the result; you must call <code>getMoreResults</code> to
 461      * move to any subsequent result(s).
 462      *
 463      * @return <code>true</code> if the first result is a <code>ResultSet</code>
 464      *         object; <code>false</code> if the first result is an update
 465      *         count or there is no result
 466      * @exception SQLException if a database access error occurs;
 467      * this method is called on a closed <code>PreparedStatement</code>
 468      * or an argument is supplied to this method
 469      * @throws SQLTimeoutException when the driver has determined that the
 470      * timeout value that was specified by the {@code setQueryTimeout}
 471      * method has been exceeded and has at least attempted to cancel
 472      * the currently running {@code Statement}
 473      * @see Statement#execute
 474      * @see Statement#getResultSet
 475      * @see Statement#getUpdateCount
 476      * @see Statement#getMoreResults
 477 
 478      */
 479     boolean execute() throws SQLException;
 480 
 481     //--------------------------JDBC 2.0-----------------------------
 482 
 483     /**
 484      * Adds a set of parameters to this <code>PreparedStatement</code>
 485      * object's batch of commands.
 486      *
 487      * @exception SQLException if a database access error occurs or
 488      * this method is called on a closed <code>PreparedStatement</code>
 489      * @see Statement#addBatch
 490      * @since 1.2
 491      */
 492     void addBatch() throws SQLException;
 493 
 494     /**
 495      * Sets the designated parameter to the given <code>Reader</code>
 496      * object, which is the given number of characters long.
 497      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
 498      * parameter, it may be more practical to send it via a
 499      * <code>java.io.Reader</code> object. The data will be read from the stream
 500      * as needed until end-of-file is reached.  The JDBC driver will
 501      * do any necessary conversion from UNICODE to the database char format.
 502      *
 503      * <P><B>Note:</B> This stream object can either be a standard
 504      * Java stream object or your own subclass that implements the
 505      * standard interface.
 506      *
 507      * @param parameterIndex the first parameter is 1, the second is 2, ...
 508      * @param reader the <code>java.io.Reader</code> object that contains the
 509      *        Unicode data
 510      * @param length the number of characters in the stream
 511      * @exception SQLException if parameterIndex does not correspond to a parameter
 512      * marker in the SQL statement; if a database access error occurs or
 513      * this method is called on a closed <code>PreparedStatement</code>
 514      * @since 1.2
 515      */
 516     void setCharacterStream(int parameterIndex,
 517                           java.io.Reader reader,
 518                           int length) throws SQLException;
 519 
 520     /**
 521      * Sets the designated parameter to the given
 522      *  <code>REF(&lt;structured-type&gt;)</code> value.
 523      * The driver converts this to an SQL <code>REF</code> value when it
 524      * sends it to the database.
 525      *
 526      * @param parameterIndex the first parameter is 1, the second is 2, ...
 527      * @param x an SQL <code>REF</code> value
 528      * @exception SQLException if parameterIndex does not correspond to a parameter
 529      * marker in the SQL statement; if a database access error occurs or
 530      * this method is called on a closed <code>PreparedStatement</code>
 531      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 532      * @since 1.2
 533      */
 534     void setRef (int parameterIndex, Ref x) throws SQLException;
 535 
 536     /**
 537      * Sets the designated parameter to the given <code>java.sql.Blob</code> object.
 538      * The driver converts this to an SQL <code>BLOB</code> value when it
 539      * sends it to the database.
 540      *
 541      * @param parameterIndex the first parameter is 1, the second is 2, ...
 542      * @param x a <code>Blob</code> object that maps an SQL <code>BLOB</code> value
 543      * @exception SQLException if parameterIndex does not correspond to a parameter
 544      * marker in the SQL statement; if a database access error occurs or
 545      * this method is called on a closed <code>PreparedStatement</code>
 546      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 547      * @since 1.2
 548      */
 549     void setBlob (int parameterIndex, Blob x) throws SQLException;
 550 
 551     /**
 552      * Sets the designated parameter to the given <code>java.sql.Clob</code> object.
 553      * The driver converts this to an SQL <code>CLOB</code> value when it
 554      * sends it to the database.
 555      *
 556      * @param parameterIndex the first parameter is 1, the second is 2, ...
 557      * @param x a <code>Clob</code> object that maps an SQL <code>CLOB</code> value
 558      * @exception SQLException if parameterIndex does not correspond to a parameter
 559      * marker in the SQL statement; if a database access error occurs or
 560      * this method is called on a closed <code>PreparedStatement</code>
 561      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 562      * @since 1.2
 563      */
 564     void setClob (int parameterIndex, Clob x) throws SQLException;
 565 
 566     /**
 567      * Sets the designated parameter to the given <code>java.sql.Array</code> object.
 568      * The driver converts this to an SQL <code>ARRAY</code> value when it
 569      * sends it to the database.
 570      *
 571      * @param parameterIndex the first parameter is 1, the second is 2, ...
 572      * @param x an <code>Array</code> object that maps an SQL <code>ARRAY</code> value
 573      * @exception SQLException if parameterIndex does not correspond to a parameter
 574      * marker in the SQL statement; if a database access error occurs or
 575      * this method is called on a closed <code>PreparedStatement</code>
 576      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 577      * @since 1.2
 578      */
 579     void setArray (int parameterIndex, Array x) throws SQLException;
 580 
 581     /**
 582      * Retrieves a <code>ResultSetMetaData</code> object that contains
 583      * information about the columns of the <code>ResultSet</code> object
 584      * that will be returned when this <code>PreparedStatement</code> object
 585      * is executed.
 586      * <P>
 587      * Because a <code>PreparedStatement</code> object is precompiled, it is
 588      * possible to know about the <code>ResultSet</code> object that it will
 589      * return without having to execute it.  Consequently, it is possible
 590      * to invoke the method <code>getMetaData</code> on a
 591      * <code>PreparedStatement</code> object rather than waiting to execute
 592      * it and then invoking the <code>ResultSet.getMetaData</code> method
 593      * on the <code>ResultSet</code> object that is returned.
 594      * <P>
 595      * <B>NOTE:</B> Using this method may be expensive for some drivers due
 596      * to the lack of underlying DBMS support.
 597      *
 598      * @return the description of a <code>ResultSet</code> object's columns or
 599      *         <code>null</code> if the driver cannot return a
 600      *         <code>ResultSetMetaData</code> object
 601      * @exception SQLException if a database access error occurs or
 602      * this method is called on a closed <code>PreparedStatement</code>
 603      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
 604      * this method
 605      * @since 1.2
 606      */
 607     ResultSetMetaData getMetaData() throws SQLException;
 608 
 609     /**
 610      * Sets the designated parameter to the given <code>java.sql.Date</code> value,
 611      * using the given <code>Calendar</code> object.  The driver uses
 612      * the <code>Calendar</code> object to construct an SQL <code>DATE</code> value,
 613      * which the driver then sends to the database.  With
 614      * a <code>Calendar</code> object, the driver can calculate the date
 615      * taking into account a custom timezone.  If no
 616      * <code>Calendar</code> object is specified, the driver uses the default
 617      * timezone, which is that of the virtual machine running the application.
 618      *
 619      * @param parameterIndex the first parameter is 1, the second is 2, ...
 620      * @param x the parameter value
 621      * @param cal the <code>Calendar</code> object the driver will use
 622      *            to construct the date
 623      * @exception SQLException if parameterIndex does not correspond to a parameter
 624      * marker in the SQL statement; if a database access error occurs or
 625      * this method is called on a closed <code>PreparedStatement</code>
 626      * @since 1.2
 627      */
 628     void setDate(int parameterIndex, java.sql.Date x, Calendar cal)
 629             throws SQLException;
 630 
 631     /**
 632      * Sets the designated parameter to the given <code>java.sql.Time</code> value,
 633      * using the given <code>Calendar</code> object.  The driver uses
 634      * the <code>Calendar</code> object to construct an SQL <code>TIME</code> value,
 635      * which the driver then sends to the database.  With
 636      * a <code>Calendar</code> object, the driver can calculate the time
 637      * taking into account a custom timezone.  If no
 638      * <code>Calendar</code> object is specified, the driver uses the default
 639      * timezone, which is that of the virtual machine running the application.
 640      *
 641      * @param parameterIndex the first parameter is 1, the second is 2, ...
 642      * @param x the parameter value
 643      * @param cal the <code>Calendar</code> object the driver will use
 644      *            to construct the time
 645      * @exception SQLException if parameterIndex does not correspond to a parameter
 646      * marker in the SQL statement; if a database access error occurs or
 647      * this method is called on a closed <code>PreparedStatement</code>
 648      * @since 1.2
 649      */
 650     void setTime(int parameterIndex, java.sql.Time x, Calendar cal)
 651             throws SQLException;
 652 
 653     /**
 654      * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value,
 655      * using the given <code>Calendar</code> object.  The driver uses
 656      * the <code>Calendar</code> object to construct an SQL <code>TIMESTAMP</code> value,
 657      * which the driver then sends to the database.  With a
 658      *  <code>Calendar</code> object, the driver can calculate the timestamp
 659      * taking into account a custom timezone.  If no
 660      * <code>Calendar</code> object is specified, the driver uses the default
 661      * timezone, which is that of the virtual machine running the application.
 662      *
 663      * @param parameterIndex the first parameter is 1, the second is 2, ...
 664      * @param x the parameter value
 665      * @param cal the <code>Calendar</code> object the driver will use
 666      *            to construct the timestamp
 667      * @exception SQLException if parameterIndex does not correspond to a parameter
 668      * marker in the SQL statement; if a database access error occurs or
 669      * this method is called on a closed <code>PreparedStatement</code>
 670      * @since 1.2
 671      */
 672     void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal)
 673             throws SQLException;
 674 
 675     /**
 676      * Sets the designated parameter to SQL <code>NULL</code>.
 677      * This version of the method <code>setNull</code> should
 678      * be used for user-defined types and REF type parameters.  Examples
 679      * of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and
 680      * named array types.
 681      *
 682      * <P><B>Note:</B> To be portable, applications must give the
 683      * SQL type code and the fully-qualified SQL type name when specifying
 684      * a NULL user-defined or REF parameter.  In the case of a user-defined type
 685      * the name is the type name of the parameter itself.  For a REF
 686      * parameter, the name is the type name of the referenced type.  If
 687      * a JDBC driver does not need the type code or type name information,
 688      * it may ignore it.
 689      *
 690      * Although it is intended for user-defined and Ref parameters,
 691      * this method may be used to set a null parameter of any JDBC type.
 692      * If the parameter does not have a user-defined or REF type, the given
 693      * typeName is ignored.
 694      *
 695      *
 696      * @param parameterIndex the first parameter is 1, the second is 2, ...
 697      * @param sqlType a value from <code>java.sql.Types</code>
 698      * @param typeName the fully-qualified name of an SQL user-defined type;
 699      *  ignored if the parameter is not a user-defined type or REF
 700      * @exception SQLException if parameterIndex does not correspond to a parameter
 701      * marker in the SQL statement; if a database access error occurs or
 702      * this method is called on a closed <code>PreparedStatement</code>
 703      * @exception SQLFeatureNotSupportedException if <code>sqlType</code> is
 704      * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
 705      * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
 706      * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
 707      *  <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
 708      * or  <code>STRUCT</code> data type and the JDBC driver does not support
 709      * this data type or if the JDBC driver does not support this method
 710      * @since 1.2
 711      */
 712   void setNull (int parameterIndex, int sqlType, String typeName)
 713     throws SQLException;
 714 
 715     //------------------------- JDBC 3.0 -----------------------------------
 716 
 717     /**
 718      * Sets the designated parameter to the given <code>java.net.URL</code> value.
 719      * The driver converts this to an SQL <code>DATALINK</code> value
 720      * when it sends it to the database.
 721      *
 722      * @param parameterIndex the first parameter is 1, the second is 2, ...
 723      * @param x the <code>java.net.URL</code> object to be set
 724      * @exception SQLException if parameterIndex does not correspond to a parameter
 725      * marker in the SQL statement; if a database access error occurs or
 726      * this method is called on a closed <code>PreparedStatement</code>
 727      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 728      * @since 1.4
 729      */
 730     void setURL(int parameterIndex, java.net.URL x) throws SQLException;
 731 
 732     /**
 733      * Retrieves the number, types and properties of this
 734      * <code>PreparedStatement</code> object's parameters.
 735      *
 736      * @return a <code>ParameterMetaData</code> object that contains information
 737      *         about the number, types and properties for each
 738      *  parameter marker of this <code>PreparedStatement</code> object
 739      * @exception SQLException if a database access error occurs or
 740      * this method is called on a closed <code>PreparedStatement</code>
 741      * @see ParameterMetaData
 742      * @since 1.4
 743      */
 744     ParameterMetaData getParameterMetaData() throws SQLException;
 745 
 746     //------------------------- JDBC 4.0 -----------------------------------
 747 
 748     /**
 749      * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
 750      * driver converts this to a SQL <code>ROWID</code> value when it sends it
 751      * to the database
 752      *
 753      * @param parameterIndex the first parameter is 1, the second is 2, ...
 754      * @param x the parameter value
 755      * @throws SQLException if parameterIndex does not correspond to a parameter
 756      * marker in the SQL statement; if a database access error occurs or
 757      * this method is called on a closed <code>PreparedStatement</code>
 758      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 759      *
 760      * @since 1.6
 761      */
 762     void setRowId(int parameterIndex, RowId x) throws SQLException;
 763 
 764 
 765     /**
 766      * Sets the designated parameter to the given <code>String</code> object.
 767      * The driver converts this to a SQL <code>NCHAR</code> or
 768      * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code> value
 769      * (depending on the argument's
 770      * size relative to the driver's limits on <code>NVARCHAR</code> values)
 771      * when it sends it to the database.
 772      *
 773      * @param parameterIndex of the first parameter is 1, the second is 2, ...
 774      * @param value the parameter value
 775      * @throws SQLException if parameterIndex does not correspond to a parameter
 776      * marker in the SQL statement; if the driver does not support national
 777      *         character sets;  if the driver can detect that a data conversion
 778      *  error could occur; if a database access error occurs; or
 779      * this method is called on a closed <code>PreparedStatement</code>
 780      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 781      * @since 1.6
 782      */
 783      void setNString(int parameterIndex, String value) throws SQLException;
 784 
 785     /**
 786      * Sets the designated parameter to a <code>Reader</code> object. The
 787      * <code>Reader</code> reads the data till end-of-file is reached. The
 788      * driver does the necessary conversion from Java character format to
 789      * the national character set in the database.
 790      * @param parameterIndex of the first parameter is 1, the second is 2, ...
 791      * @param value the parameter value
 792      * @param length the number of characters in the parameter data.
 793      * @throws SQLException if parameterIndex does not correspond to a parameter
 794      * marker in the SQL statement; if the driver does not support national
 795      *         character sets;  if the driver can detect that a data conversion
 796      *  error could occur; if a database access error occurs; or
 797      * this method is called on a closed <code>PreparedStatement</code>
 798      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 799      * @since 1.6
 800      */
 801      void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException;
 802 
 803     /**
 804      * Sets the designated parameter to a <code>java.sql.NClob</code> object. The driver converts this to a
 805      * SQL <code>NCLOB</code> value when it sends it to the database.
 806      * @param parameterIndex of the first parameter is 1, the second is 2, ...
 807      * @param value the parameter value
 808      * @throws SQLException if parameterIndex does not correspond to a parameter
 809      * marker in the SQL statement; if the driver does not support national
 810      *         character sets;  if the driver can detect that a data conversion
 811      *  error could occur; if a database access error occurs; or
 812      * this method is called on a closed <code>PreparedStatement</code>
 813      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 814      * @since 1.6
 815      */
 816      void setNClob(int parameterIndex, NClob value) throws SQLException;
 817 
 818     /**
 819      * Sets the designated parameter to a <code>Reader</code> object.  The reader must contain  the number
 820      * of characters specified by length otherwise a <code>SQLException</code> will be
 821      * generated when the <code>PreparedStatement</code> is executed.
 822      *This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
 823      * because it informs the driver that the parameter value should be sent to
 824      * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
 825      * driver may have to do extra work to determine whether the parameter
 826      * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
 827      * @param parameterIndex index of the first parameter is 1, the second is 2, ...
 828      * @param reader An object that contains the data to set the parameter value to.
 829      * @param length the number of characters in the parameter data.
 830      * @throws SQLException if parameterIndex does not correspond to a parameter
 831      * marker in the SQL statement; if a database access error occurs; this method is called on
 832      * a closed <code>PreparedStatement</code> or if the length specified is less than zero.
 833      *
 834      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 835      * @since 1.6
 836      */
 837      void setClob(int parameterIndex, Reader reader, long length)
 838        throws SQLException;
 839 
 840     /**
 841      * Sets the designated parameter to a <code>InputStream</code> object. 
 842      * The {@code Inputstream} must contain  the number
 843      * of characters specified by length otherwise a <code>SQLException</code> will be
 844      * generated when the <code>PreparedStatement</code> is executed.
 845      * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
 846      * method because it informs the driver that the parameter value should be
 847      * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
 848      * the driver may have to do extra work to determine whether the parameter
 849      * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
 850      * @param parameterIndex index of the first parameter is 1,
 851      * the second is 2, ...
 852      * @param inputStream An object that contains the data to set the parameter
 853      * value to.
 854      * @param length the number of bytes in the parameter data.
 855      * @throws SQLException if parameterIndex does not correspond to a parameter
 856      * marker in the SQL statement; if a database access error occurs;
 857      * this method is called on a closed <code>PreparedStatement</code>;
 858      * if the length specified
 859      * is less than zero or if the number of bytes in the {@code InputStream} does not match
 860      * the specified length.
 861      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 862      *
 863      * @since 1.6
 864      */
 865      void setBlob(int parameterIndex, InputStream inputStream, long length)
 866         throws SQLException;
 867     /**
 868      * Sets the designated parameter to a <code>Reader</code> object.  The reader must contain  the number
 869      * of characters specified by length otherwise a <code>SQLException</code> will be
 870      * generated when the <code>PreparedStatement</code> is executed.
 871      * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
 872      * because it informs the driver that the parameter value should be sent to
 873      * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
 874      * driver may have to do extra work to determine whether the parameter
 875      * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
 876      * @param parameterIndex index of the first parameter is 1, the second is 2, ...
 877      * @param reader An object that contains the data to set the parameter value to.
 878      * @param length the number of characters in the parameter data.
 879      * @throws SQLException if parameterIndex does not correspond to a parameter
 880      * marker in the SQL statement; if the length specified is less than zero;
 881      * if the driver does not support national character sets;
 882      * if the driver can detect that a data conversion
 883      *  error could occur;  if a database access error occurs or
 884      * this method is called on a closed <code>PreparedStatement</code>
 885      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 886      *
 887      * @since 1.6
 888      */
 889      void setNClob(int parameterIndex, Reader reader, long length)
 890        throws SQLException;
 891 
 892      /**
 893       * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object.
 894       * The driver converts this to an
 895       * SQL <code>XML</code> value when it sends it to the database.
 896       *
 897       * @param parameterIndex index of the first parameter is 1, the second is 2, ...
 898       * @param xmlObject a <code>SQLXML</code> object that maps an SQL <code>XML</code> value
 899       * @throws SQLException if parameterIndex does not correspond to a parameter
 900      * marker in the SQL statement; if a database access error occurs;
 901       *  this method is called on a closed <code>PreparedStatement</code>
 902       * or the <code>java.xml.transform.Result</code>,
 903       *  <code>Writer</code> or <code>OutputStream</code> has not been closed for
 904       * the <code>SQLXML</code> object
 905       * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
 906       *
 907       * @since 1.6
 908       */
 909      void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException;
 910 
 911     /**
 912      * <p>Sets the value of the designated parameter with the given object.
 913      *
 914      * If the second argument is an <code>InputStream</code> then the stream must contain
 915      * the number of bytes specified by scaleOrLength.  If the second argument is a
 916      * <code>Reader</code> then the reader must contain the number of characters specified
 917      * by scaleOrLength. If these conditions are not true the driver will generate a
 918      * <code>SQLException</code> when the prepared statement is executed.
 919      *
 920      * <p>The given Java object will be converted to the given targetSqlType
 921      * before being sent to the database.
 922      *
 923      * If the object has a custom mapping (is of a class implementing the
 924      * interface <code>SQLData</code>),
 925      * the JDBC driver should call the method <code>SQLData.writeSQL</code> to
 926      * write it to the SQL data stream.
 927      * If, on the other hand, the object is of a class implementing
 928      * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>,  <code>NClob</code>,
 929      *  <code>Struct</code>, <code>java.net.URL</code>,
 930      * or <code>Array</code>, the driver should pass it to the database as a
 931      * value of the corresponding SQL type.
 932      *
 933      * <p>Note that this method may be used to pass database-specific
 934      * abstract data types.
 935      *
 936      * @param parameterIndex the first parameter is 1, the second is 2, ...
 937      * @param x the object containing the input parameter value
 938      * @param targetSqlType the SQL type (as defined in java.sql.Types) to be
 939      * sent to the database. The scale argument may further qualify this type.
 940      * @param scaleOrLength for <code>java.sql.Types.DECIMAL</code>
 941      *          or <code>java.sql.Types.NUMERIC types</code>,
 942      *          this is the number of digits after the decimal point. For
 943      *          Java Object types <code>InputStream</code> and <code>Reader</code>,
 944      *          this is the length
 945      *          of the data in the stream or reader.  For all other types,
 946      *          this value will be ignored.
 947      * @exception SQLException if parameterIndex does not correspond to a parameter
 948      * marker in the SQL statement; if a database access error occurs;
 949      * this method is called on a closed <code>PreparedStatement</code> or
 950      *            if the Java Object specified by x is an InputStream
 951      *            or Reader object and the value of the scale parameter is less
 952      *            than zero
 953      * @exception SQLFeatureNotSupportedException if
 954      * the JDBC driver does not support the specified targetSqlType
 955      * @see Types
 956      *
 957      */
 958     void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)
 959             throws SQLException;
 960    /**
 961      * Sets the designated parameter to the given input stream, which will have
 962      * the specified number of bytes.
 963      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
 964      * parameter, it may be more practical to send it via a
 965      * <code>java.io.InputStream</code>. Data will be read from the stream
 966      * as needed until end-of-file is reached.  The JDBC driver will
 967      * do any necessary conversion from ASCII to the database char format.
 968      *
 969      * <P><B>Note:</B> This stream object can either be a standard
 970      * Java stream object or your own subclass that implements the
 971      * standard interface.
 972      *
 973      * @param parameterIndex the first parameter is 1, the second is 2, ...
 974      * @param x the Java input stream that contains the ASCII parameter value
 975      * @param length the number of bytes in the stream
 976      * @exception SQLException if parameterIndex does not correspond to a parameter
 977      * marker in the SQL statement; if a database access error occurs or
 978      * this method is called on a closed <code>PreparedStatement</code>
 979      * @since 1.6
 980     */
 981     void setAsciiStream(int parameterIndex, java.io.InputStream x, long length)
 982             throws SQLException;
 983     /**
 984      * Sets the designated parameter to the given input stream, which will have
 985      * the specified number of bytes.
 986      * When a very large binary value is input to a <code>LONGVARBINARY</code>
 987      * parameter, it may be more practical to send it via a
 988      * <code>java.io.InputStream</code> object. The data will be read from the
 989      * stream as needed until end-of-file is reached.
 990      *
 991      * <P><B>Note:</B> This stream object can either be a standard
 992      * Java stream object or your own subclass that implements the
 993      * standard interface.
 994      *
 995      * @param parameterIndex the first parameter is 1, the second is 2, ...
 996      * @param x the java input stream which contains the binary parameter value
 997      * @param length the number of bytes in the stream
 998      * @exception SQLException if parameterIndex does not correspond to a parameter
 999      * marker in the SQL statement; if a database access error occurs or
1000      * this method is called on a closed <code>PreparedStatement</code>
1001      * @since 1.6
1002      */
1003     void setBinaryStream(int parameterIndex, java.io.InputStream x,
1004                          long length) throws SQLException;
1005         /**
1006      * Sets the designated parameter to the given <code>Reader</code>
1007      * object, which is the given number of characters long.
1008      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
1009      * parameter, it may be more practical to send it via a
1010      * <code>java.io.Reader</code> object. The data will be read from the stream
1011      * as needed until end-of-file is reached.  The JDBC driver will
1012      * do any necessary conversion from UNICODE to the database char format.
1013      *
1014      * <P><B>Note:</B> This stream object can either be a standard
1015      * Java stream object or your own subclass that implements the
1016      * standard interface.
1017      *
1018      * @param parameterIndex the first parameter is 1, the second is 2, ...
1019      * @param reader the <code>java.io.Reader</code> object that contains the
1020      *        Unicode data
1021      * @param length the number of characters in the stream
1022      * @exception SQLException if parameterIndex does not correspond to a parameter
1023      * marker in the SQL statement; if a database access error occurs or
1024      * this method is called on a closed <code>PreparedStatement</code>
1025      * @since 1.6
1026      */
1027     void setCharacterStream(int parameterIndex,
1028                           java.io.Reader reader,
1029                           long length) throws SQLException;
1030     //-----
1031     /**
1032      * Sets the designated parameter to the given input stream.
1033      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
1034      * parameter, it may be more practical to send it via a
1035      * <code>java.io.InputStream</code>. Data will be read from the stream
1036      * as needed until end-of-file is reached.  The JDBC driver will
1037      * do any necessary conversion from ASCII to the database char format.
1038      *
1039      * <P><B>Note:</B> This stream object can either be a standard
1040      * Java stream object or your own subclass that implements the
1041      * standard interface.
1042      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1043      * it might be more efficient to use a version of
1044      * <code>setAsciiStream</code> which takes a length parameter.
1045      *
1046      * @param parameterIndex the first parameter is 1, the second is 2, ...
1047      * @param x the Java input stream that contains the ASCII parameter value
1048      * @exception SQLException if parameterIndex does not correspond to a parameter
1049      * marker in the SQL statement; if a database access error occurs or
1050      * this method is called on a closed <code>PreparedStatement</code>
1051      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1052        * @since 1.6
1053     */
1054     void setAsciiStream(int parameterIndex, java.io.InputStream x)
1055             throws SQLException;
1056     /**
1057      * Sets the designated parameter to the given input stream.
1058      * When a very large binary value is input to a <code>LONGVARBINARY</code>
1059      * parameter, it may be more practical to send it via a
1060      * <code>java.io.InputStream</code> object. The data will be read from the
1061      * stream as needed until end-of-file is reached.
1062      *
1063      * <P><B>Note:</B> This stream object can either be a standard
1064      * Java stream object or your own subclass that implements the
1065      * standard interface.
1066      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1067      * it might be more efficient to use a version of
1068      * <code>setBinaryStream</code> which takes a length parameter.
1069      *
1070      * @param parameterIndex the first parameter is 1, the second is 2, ...
1071      * @param x the java input stream which contains the binary parameter value
1072      * @exception SQLException if parameterIndex does not correspond to a parameter
1073      * marker in the SQL statement; if a database access error occurs or
1074      * this method is called on a closed <code>PreparedStatement</code>
1075      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1076      * @since 1.6
1077      */
1078     void setBinaryStream(int parameterIndex, java.io.InputStream x)
1079     throws SQLException;
1080         /**
1081      * Sets the designated parameter to the given <code>Reader</code>
1082      * object.
1083      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
1084      * parameter, it may be more practical to send it via a
1085      * <code>java.io.Reader</code> object. The data will be read from the stream
1086      * as needed until end-of-file is reached.  The JDBC driver will
1087      * do any necessary conversion from UNICODE to the database char format.
1088      *
1089      * <P><B>Note:</B> This stream object can either be a standard
1090      * Java stream object or your own subclass that implements the
1091      * standard interface.
1092      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1093      * it might be more efficient to use a version of
1094      * <code>setCharacterStream</code> which takes a length parameter.
1095      *
1096      * @param parameterIndex the first parameter is 1, the second is 2, ...
1097      * @param reader the <code>java.io.Reader</code> object that contains the
1098      *        Unicode data
1099      * @exception SQLException if parameterIndex does not correspond to a parameter
1100      * marker in the SQL statement; if a database access error occurs or
1101      * this method is called on a closed <code>PreparedStatement</code>
1102      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1103      * @since 1.6
1104      */
1105     void setCharacterStream(int parameterIndex,
1106                           java.io.Reader reader) throws SQLException;
1107   /**
1108      * Sets the designated parameter to a <code>Reader</code> object. The
1109      * <code>Reader</code> reads the data till end-of-file is reached. The
1110      * driver does the necessary conversion from Java character format to
1111      * the national character set in the database.
1112 
1113      * <P><B>Note:</B> This stream object can either be a standard
1114      * Java stream object or your own subclass that implements the
1115      * standard interface.
1116      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1117      * it might be more efficient to use a version of
1118      * <code>setNCharacterStream</code> which takes a length parameter.
1119      *
1120      * @param parameterIndex of the first parameter is 1, the second is 2, ...
1121      * @param value the parameter value
1122      * @throws SQLException if parameterIndex does not correspond to a parameter
1123      * marker in the SQL statement; if the driver does not support national
1124      *         character sets;  if the driver can detect that a data conversion
1125      *  error could occur; if a database access error occurs; or
1126      * this method is called on a closed <code>PreparedStatement</code>
1127      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1128      * @since 1.6
1129      */
1130      void setNCharacterStream(int parameterIndex, Reader value) throws SQLException;
1131 
1132     /**
1133      * Sets the designated parameter to a <code>Reader</code> object.
1134      * This method differs from the <code>setCharacterStream (int, Reader)</code> method
1135      * because it informs the driver that the parameter value should be sent to
1136      * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
1137      * driver may have to do extra work to determine whether the parameter
1138      * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
1139      *
1140      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1141      * it might be more efficient to use a version of
1142      * <code>setClob</code> which takes a length parameter.
1143      *
1144      * @param parameterIndex index of the first parameter is 1, the second is 2, ...
1145      * @param reader An object that contains the data to set the parameter value to.
1146      * @throws SQLException if parameterIndex does not correspond to a parameter
1147      * marker in the SQL statement; if a database access error occurs; this method is called on
1148      * a closed <code>PreparedStatement</code>or if parameterIndex does not correspond to a parameter
1149      * marker in the SQL statement
1150      *
1151      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1152      * @since 1.6
1153      */
1154      void setClob(int parameterIndex, Reader reader)
1155        throws SQLException;
1156 
1157     /**
1158      * Sets the designated parameter to a <code>InputStream</code> object.
1159      * This method differs from the <code>setBinaryStream (int, InputStream)</code>
1160      * method because it informs the driver that the parameter value should be
1161      * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
1162      * the driver may have to do extra work to determine whether the parameter
1163      * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
1164      *
1165      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1166      * it might be more efficient to use a version of
1167      * <code>setBlob</code> which takes a length parameter.
1168      *
1169      * @param parameterIndex index of the first parameter is 1,
1170      * the second is 2, ...
1171      * @param inputStream An object that contains the data to set the parameter
1172      * value to.
1173      * @throws SQLException if parameterIndex does not correspond to a parameter
1174      * marker in the SQL statement; if a database access error occurs;
1175      * this method is called on a closed <code>PreparedStatement</code> or
1176      * if parameterIndex does not correspond
1177      * to a parameter marker in the SQL statement,
1178      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1179      *
1180      * @since 1.6
1181      */
1182      void setBlob(int parameterIndex, InputStream inputStream)
1183         throws SQLException;
1184     /**
1185      * Sets the designated parameter to a <code>Reader</code> object.
1186      * This method differs from the <code>setCharacterStream (int, Reader)</code> method
1187      * because it informs the driver that the parameter value should be sent to
1188      * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
1189      * driver may have to do extra work to determine whether the parameter
1190      * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
1191      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
1192      * it might be more efficient to use a version of
1193      * <code>setNClob</code> which takes a length parameter.
1194      *
1195      * @param parameterIndex index of the first parameter is 1, the second is 2, ...
1196      * @param reader An object that contains the data to set the parameter value to.
1197      * @throws SQLException if parameterIndex does not correspond to a parameter
1198      * marker in the SQL statement;
1199      * if the driver does not support national character sets;
1200      * if the driver can detect that a data conversion
1201      *  error could occur;  if a database access error occurs or
1202      * this method is called on a closed <code>PreparedStatement</code>
1203      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
1204      *
1205      * @since 1.6
1206      */
1207      void setNClob(int parameterIndex, Reader reader)
1208        throws SQLException;
1209 
1210     //------------------------- JDBC 4.2 -----------------------------------
1211 
1212     /**
1213      * <p>Sets the value of the designated parameter with the given object.
1214      *
1215      * If the second argument is an {@code InputStream} then the stream
1216      * must contain the number of bytes specified by scaleOrLength.
1217      * If the second argument is a {@code Reader} then the reader must
1218      * contain the number of characters specified by scaleOrLength. If these
1219      * conditions are not true the driver will generate a
1220      * {@code SQLException} when the prepared statement is executed.
1221      *
1222      * <p>The given Java object will be converted to the given targetSqlType
1223      * before being sent to the database.
1224      *
1225      * If the object has a custom mapping (is of a class implementing the
1226      * interface {@code SQLData}),
1227      * the JDBC driver should call the method {@code SQLData.writeSQL} to
1228      * write it to the SQL data stream.
1229      * If, on the other hand, the object is of a class implementing
1230      * {@code Ref}, {@code Blob}, {@code Clob},  {@code NClob},
1231      *  {@code Struct}, {@code java.net.URL},
1232      * or {@code Array}, the driver should pass it to the database as a
1233      * value of the corresponding SQL type.
1234      *
1235      * <p>Note that this method may be used to pass database-specific
1236      * abstract data types.
1237      *<P>
1238      * The default implementation will throw {@code SQLFeatureNotSupportedException}
1239      *
1240      * @param parameterIndex the first parameter is 1, the second is 2, ...
1241      * @param x the object containing the input parameter value
1242      * @param targetSqlType the SQL type to be sent to the database. The
1243      * scale argument may further qualify this type.
1244      * @param scaleOrLength for {@code java.sql.JDBCType.DECIMAL}
1245      *          or {@code java.sql.JDBCType.NUMERIC types},
1246      *          this is the number of digits after the decimal point. For
1247      *          Java Object types {@code InputStream} and {@code Reader},
1248      *          this is the length
1249      *          of the data in the stream or reader.  For all other types,
1250      *          this value will be ignored.
1251      * @exception SQLException if parameterIndex does not correspond to a
1252      * parameter marker in the SQL statement; if a database access error occurs
1253      * or this method is called on a closed {@code PreparedStatement}  or
1254      *            if the Java Object specified by x is an InputStream
1255      *            or Reader object and the value of the scale parameter is less
1256      *            than zero
1257      * @exception SQLFeatureNotSupportedException if
1258      * the JDBC driver does not support the specified targetSqlType
1259      * @see JDBCType
1260      * @see SQLType
1261      * @since 1.8
1262      */
1263     default void setObject(int parameterIndex, Object x, SQLType targetSqlType,
1264              int scaleOrLength) throws SQLException {
1265         throw new SQLFeatureNotSupportedException("setObject not implemented");
1266     }
1267 
1268     /**
1269      * Sets the value of the designated parameter with the given object.
1270      *
1271      * This method is similar to {@link #setObject(int parameterIndex,
1272      * Object x, SQLType targetSqlType, int scaleOrLength)},
1273      * except that it assumes a scale of zero.
1274      *<P>
1275      * The default implementation will throw {@code SQLFeatureNotSupportedException}
1276      *
1277      * @param parameterIndex the first parameter is 1, the second is 2, ...
1278      * @param x the object containing the input parameter value
1279      * @param targetSqlType the SQL type to be sent to the database
1280      * @exception SQLException if parameterIndex does not correspond to a
1281      * parameter marker in the SQL statement; if a database access error occurs
1282      * or this method is called on a closed {@code PreparedStatement}
1283      * @exception SQLFeatureNotSupportedException if
1284      * the JDBC driver does not support the specified targetSqlType
1285      * @see JDBCType
1286      * @see SQLType
1287      * @since 1.8
1288      */
1289     default void setObject(int parameterIndex, Object x, SQLType targetSqlType)
1290       throws SQLException {
1291         throw new SQLFeatureNotSupportedException("setObject not implemented");
1292     }
1293 
1294     /**
1295      * Executes the SQL statement in this <code>PreparedStatement</code> object,
1296      * which must be an SQL Data Manipulation Language (DML) statement,
1297      * such as <code>INSERT</code>, <code>UPDATE</code> or
1298      * <code>DELETE</code>; or an SQL statement that returns nothing,
1299      * such as a DDL statement.
1300      * <p>
1301      * This method should be used when the returned row count may exceed
1302      * {@link Integer#MAX_VALUE}.
1303      * <p>
1304      * The default implementation will throw {@code UnsupportedOperationException}
1305      *
1306      * @return either (1) the row count for SQL Data Manipulation Language
1307      * (DML) statements or (2) 0 for SQL statements that return nothing
1308      * @exception SQLException if a database access error occurs;
1309      * this method is called on a closed  <code>PreparedStatement</code>
1310      * or the SQL statement returns a <code>ResultSet</code> object
1311      * @throws SQLTimeoutException when the driver has determined that the
1312      * timeout value that was specified by the {@code setQueryTimeout}
1313      * method has been exceeded and has at least attempted to cancel
1314      * the currently running {@code Statement}
1315      * @since 1.8
1316      */
1317     default long executeLargeUpdate() throws SQLException {
1318         throw new UnsupportedOperationException("executeLargeUpdate not implemented");
1319     }
1320 }