|Oracle8i JDBC Developer's Guide and Reference
Release 3 (8.1.7)
Part Number A83724-01
The following limitations exist in the Oracle JDBC implementation, but all of them are either insignificant or have easy workarounds.
Oracle JDBC drivers do not support the
get getCursorName() and
setCursorName() methods, because there is no convenient way to map them to Oracle constructs. Oracle recommends using
ROWID instead. For more information on how to use and manipulate ROWIDs, see "Oracle ROWID Type".
Oracle JDBC drivers do not support SQL92 outer join escapes. Use Oracle SQL syntax with "(+)" instead. For more information on SQL92 syntax, see "Embedded SQL92 Syntax".
It is not feasible for Oracle JDBC drivers to support calling arguments or return values of the PL/SQL
BOOLEAN, or table with non-scalar element types. However, Oracle JDBC drivers support PL/SQL index-by table of scalar element types. For a complete description of this, see Chapter 11, "Accessing PL/SQL Index-by Tables".
As a workaround to PL/SQL
BOOLEAN, or non-scalar table types, create wrapper procedures that handle the data as types supported by JDBC. For example, to wrap a stored procedure that uses PL/SQL booleans, create a stored procedure that takes a character or number from JDBC and passes it to the original procedure as
BOOLEAN or, for an output parameter, accepts a
BOOLEAN argument from the original procedure and passes it as a
NUMBER to JDBC. Similarly, to wrap a stored procedure that uses PL/SQL records, create a stored procedure that handles a record in its individual components (such as
NUMBER) or in a structured object type. To wrap a stored procedure that uses PL/SQL tables, break the data into components or perhaps use Oracle collection types.
For an example of a workaround for
BOOLEAN, see "Boolean Parameters in PL/SQL Stored Procedures".
The arithmetic for the Oracle
NUMBER type does not comply with the IEEE 754 standard for floating-point arithmetic. Therefore, there can be small disagreements between the results of computations performed by Oracle and the same computations performed by Java.
Oracle stores numbers in a format compatible with decimal arithmetic and guarantees 38 decimal digits of precision. It represents zero, minus infinity, and plus infinity exactly. For each positive number it represents, it represents a negative number of the same absolute value.
It represents every positive number between 10-30 and (1 - 10-38) * 10126 to full 38-digit precision.
DatabaseMetaData methods define a
catalog parameter. This parameter is one of the selection criteria for the method. Oracle does not have multiple catalogs, but it does have packages. For more information on how the Oracle JDBC drivers treat the
catalog argument, see "DatabaseMetaData TABLE_REMARKS Reporting".
java.sql.SQLWarning class provides information on a database access warning. Warnings typically contain a description of the warning and a code that identifies the warning. Warnings are silently chained to the object whose method caused it to be reported. The Oracle JDBC drivers generally do not support
SQLWarning. (As an exception to this, scrollable result set operations do generate SQL warnings, but the
SQLWarning instance is created on the client, not in the database.)
For information on how the Oracle JDBC drivers handle errors, see "Processing SQL Exceptions".
Binding by name is not supported. Under certain circumstances, previous versions of the Oracle JDBC drivers have allowed binding statement variables by name. In the following statement, the named variable
EmpId would be bound to the integer
PreparedStatement p = conn.prepareStatement ("SELECT name FROM emp WHERE id = :EmpId"); p.setInt(1, 314159);
This capability to bind by name is not part of the JDBC specification, either 1.0 or 2.0, and Oracle does not support it. The JDBC drivers can throw a
SQLException or produce unexpected results.
Prior releases of the Oracle JDBC drivers did not retain bound values from one call of execute to the next as specified in JDBC 1.0. Bound values are now retained. For example:
PreparedStatement p = conn.prepareStatement ("SELECT name FROM emp WHERE id = :? AND dept = :?"); p.setInt(1, 314159); p.setString(2, "SALES"); ResultSet r1 = p.execute(); p.setInt(1, 425260); ResultSet r2 = p.execute();
SQLException would be thrown by the second
execute() call because no value was bound to the second argument. In this release, the second execute will return the correct value, retaining the binding of the second argument to the string "
If the retained bound value is a stream, then the Oracle JDBC drivers will not reset the stream. Unless the application code resets, repositions, or otherwise modifies the stream, the subsequent execute calls will send
NULL as the value of the argument.