Oracle9i JDBC Developer's Guide and Reference
Release 1 (9.0.1)

Part Number A90211-01
Go To Documentation Library
Home
Go To Product List
Solution Area
Go To Table Of Contents
Contents
Go To Index
Index

Go to previous page Go to next page

5
Overview of Oracle Extensions

Oracle's extensions to the JDBC standard include Java packages and interfaces that let you access and manipulate Oracle datatypes and use Oracle performance extensions. Compared to standard JDBC, the extensions offer you greater flexibility in how you can manipulate the data. This chapter presents an overview of the packages and classes included in Oracle's extensions to standard JDBC. It also describes some of the key support features of the extensions.

This chapter includes these topics:

Introduction to Oracle Extensions

Oracle provides two implementations of its JDBC drivers--one that supports Sun Microsystems JDK 1.2.x and complies with the Sun JDBC 2.0 standard, and one that supports JDK 1.1.x and complies with the Sun JDBC 1.22 standard.

Beyond standard features, Oracle JDBC drivers provide Oracle-specific type extensions and performance extensions.

Both implementations include the following Java packages:

In addition to these packages, the implementation for JDK 1.1.x includes the following Java package. This package supports some JDBC 2.0 features by providing interfaces that mimic the JDBC 2.0 interfaces in the standard java.sql package:

(For example, oracle.jdbc2.Struct mimics java.sql.Struct, which exists in JDK 1.2.)

"Oracle JDBC Packages and Classes" further describes the preceding packages and their classes.

Support Features of the Oracle Extensions

The Oracle extensions to JDBC include a number of features that enhance your ability to work with Oracle databases. Among these are support for Oracle datatypes, Oracle objects, and specific schema naming.

Support for Oracle Datatypes

A key feature of the Oracle JDBC extensions is the type support in the oracle.sql package. This package includes classes that map to all the Oracle SQL datatypes, acting as wrappers for raw SQL data. This functionality provides two significant advantages in manipulating SQL data:

Once manipulations are complete and it is time to output the information, each of the oracle.sql.* type support classes has all the necessary methods to convert data to appropriate Java formats. For a more detailed description of these general issues, see "Package oracle.sql".

See the following for more information on specific oracle.sql.* datatype classes:

Support for Oracle Objects

Oracle JDBC supports the use of structured objects in the database, where an object datatype is a user-defined type with nested attributes. For example, a user application could define an Employee object type, where each Employee object has a firstname attribute (a character string), a lastname attribute (another character string), and an employeenumber attribute (integer).

Oracle's JDBC implementation supports Oracle object datatypes. When you work with Oracle object datatypes in a Java application, you must consider the following:

Oracle objects can be mapped either to the weak java.sql.Struct or oracle.sql.STRUCT types or to strongly typed customized classes. These strong types are referred to as custom Java classes, which must implement either the standard java.sql.SQLData interface or the Oracle extension oracle.sql.ORAData interface. (Chapter 8, "Working with Oracle Object Types" provides more detail regarding these interfaces.) Each interface specifies methods to convert data between SQL and Java.


Note:

The ORAData interface has replaced the CustomDatum interface. While the latter interface is deprecated for Oracle9i, it is still supported for backward compatibility. 


To create custom Java classes to correspond to your Oracle objects, Oracle recommends that you use the Oracle9i JPublisher utility to create the classes. To do this, you must define attributes according to how you want to store the data. JPublisher performs this task seamlessly with command-line options and can generate either SQLData or ORAData implementations.

For SQLData implementations, a type map defines the correspondence between Oracle object datatypes and Java classes. Type maps are objects of a special Java class that specify which Java class corresponds to each Oracle object datatype. Oracle JDBC uses these type maps to determine which Java class to instantiate and populate when it retrieves Oracle object data from a result set.


Note:

Oracle recommends using the ORAData interface, instead of the SQLData interface, in situations where portability is not a concern. ORAData works more easily and flexibly in conjunction with other features of the Oracle Java platform offerings. 


JPublisher automatically defines getXXX() methods of the custom Java classes, which retrieve data into your Java application. For more information on the JPublisher utility, see the Oracle9i JPublisher User's Guide.

Chapter 8, "Working with Oracle Object Types" describes Oracle JDBC support for Oracle objects.

Support for Schema Naming

Oracle JDBC classes have the ability to accept and return fully qualified schema names. A fully qualified schema name has this syntax:

{[schema_name].}[sql_type_name] 
 

Where schema_name is the name of the schema and sql_type_name is the SQL type name of the object. Notice that schema_name and sql_type_name are separated by a dot (".").

To specify an object type in JDBC, you use its fully qualified name (that is, a schema name and SQL type name). It is not necessary to enter a schema name if the type name is in current naming space (that is, the current schema). Schema naming follows these rules:

OCI Extensions

See Chapter 16, "JDBC OCI Extensions" for the following OCI driver-specific information:

Oracle JDBC Packages and Classes

This section describes the Java packages that support the Oracle JDBC extensions and the key classes that are included in these packages:

You can refer to the Oracle JDBC Javadoc for more information about all the classes mentioned in this section.

Package oracle.sql

The oracle.sql package supports direct access to data in SQL format. This package consists primarily of classes that provide Java mappings to SQL datatypes.

Essentially, the classes act as Java wrappers for the raw SQL data. Because data in an oracle.sql.* object remains in SQL format, no information is lost. For SQL primitive types, these classes simply wrap the SQL data. For SQL structured types (objects and arrays), they provide additional information such as conversion methods and details of structure.

Each of the oracle.sql.* datatype classes extends oracle.sql.Datum, a superclass that encapsulates functionality common to all the datatypes. Some of the classes are for JDBC 2.0-compliant datatypes. These classes, as Table 5-1 indicates, implement standard JDBC 2.0 interfaces in the java.sql package (oracle.jdbc2 for JDK 1.1.x), as well as extending the oracle.sql.Datum class.

Classes of the oracle.sql Package

Table 5-1 lists the oracle.sql datatype classes and their corresponding Oracle SQL types.

Table 5-1 Oracle Datatype Classes  
Java Class  Oracle SQL Types and Interfaces Implemented 

oracle.sql.STRUCT 

STRUCT (objects) implements java.sql.Struct (oracle.jdbc2.Struct under JDK 1.1.x) 

oracle.sql.REF 

REF (object references) implements java.sql.Ref (oracle.jdbc2.Ref under JDK 1.1.x) 

oracle.sql.ARRAY 

VARRAY or nested table (collections) implements java.sql.Array (oracle.jdbc2.Array under JDK 1.1.x) 

oracle.sql.BLOB 

BLOB (binary large objects) implements java.sql.Blob (oracle.jdbc2.Blob under JDK 1.1.x) 

oracle.sql.CLOB 

SQL CLOB (character large objects) and Globalization Support NCLOB datatypes both implement java.sql.Clob (oracle.jdbc2.Clob under JDK 1.1.x) 

oracle.sql.BFILE 

BFILE (external files) 

oracle.sql.CHAR 

CHAR, NCHAR, VARCHAR2, NVARCHAR2 

oracle.sql.DATE 

DATE 

oracle.sql.TIMESTAMP 

TIMESTAMP 

oracle.sql.TIMESTAMPTZ 

TIMESTAMPTZ (Timestamp with Time Zone) 

oracle.sql.TIMESTAMPLTZ 

TIMESTAMPLTZ (Timestamp with Local Time Zone) 

oracle.sql.NUMBER 

NUMBER 

oracle.sql.RAW 

RAW 

oracle.sql.ROWID 

ROWID (row identifiers) 

oracle.sql.OPAQUE 

OPAQUE 

You can find more detailed information about each of these classes later in this chapter. Additional details about use of the Oracle extended types (STRUCT, REF, ARRAY, BLOB, CLOB, BFILE, and ROWID) are described in the following locations:

In addition to the datatype classes, the oracle.sql package includes the following support classes and interfaces, primarily for use with objects and collections:

General oracle.sql.* Datatype Support

Each of the Oracle datatype classes provides, among other things, the following:

Refer to the Oracle JDBC Javadoc for additional information about these classes. See "Class oracle.sql.CHAR" to learn how the oracle.sql.CHAR class supports character data.

Overview of Class oracle.sql.STRUCT

For any given Oracle object type, it is usually desirable to define a custom mapping between SQL and Java. (If you use a SQLData custom Java class, the mapping must be defined in a type map.)

If you choose not to define a mapping, however, then data from the object type will be materialized in Java in an instance of the oracle.sql.STRUCT class.

The STRUCT class implements the standard JDBC 2.0 java.sql.Struct interface (oracle.jdbc2.Struct under JDK 1.1.x) and extends the oracle.sql.Datum class.

In the database, Oracle stores the raw bytes of object data in a linearized form. A STRUCT object is a wrapper for the raw bytes of an Oracle object. It contains the SQL type name of the Oracle object and a "values" array of oracle.sql.Datum objects that hold the attribute values in SQL format.

You can materialize a STRUCT's attributes as oracle.sql.Datum[] objects if you use the getOracleAttributes() method, or as java.lang.Object[] objects if you use the getAttributes() method. Materializing the attributes as oracle.sql.* objects gives you all the advantages of the oracle.sql.* format:

In some cases, you might want to manually create a STRUCT object and pass it to a prepared statement or callable statement. To do this, you must also create a StructDescriptor object.

For more information about working with Oracle objects using the oracle.sql.STRUCT and StructDescriptor classes, see "Using the Default STRUCT Class for Oracle Objects".

Overview of Class oracle.sql.REF

The oracle.sql.REF class is the generic class that supports Oracle object references. This class, as with all oracle.sql.* datatype classes, is a subclass of the oracle.sql.Datum class. It implements the standard JDBC 2.0 java.sql.Ref interface (oracle.jdbc2.Ref under JDK 1.1.x).

The REF class has methods to retrieve and pass object references. Be aware, however, that selecting an object reference retrieves only a pointer to an object. This does not materialize the object itself. But the REF class also includes methods to retrieve and pass the object data.

You cannot create REF objects in your JDBC application--you can only retrieve existing REF objects from the database.

For more information about working with Oracle object references using the oracle.sql.REF class, see Chapter 9, "Working with Oracle Object References".

Overview of Class oracle.sql.ARRAY

The oracle.sql.ARRAY class supports Oracle collections--either VARRAYs or nested tables. If you select either a VARRAY or nested table from the database, then the JDBC driver materializes it as an object of the ARRAY class; the structure of the data is equivalent in either case. The oracle.sql.ARRAY class extends oracle.sql.Datum and implements the standard JDBC 2.0 java.sql.Array interface (oracle.jdbc2.Array under JDK 1.1.x).

You can use the setARRAY() method of the OraclePreparedStatement or OracleCallableStatement class to pass an array as an input parameter to a prepared statement. Similarly, you might want to manually create an ARRAY object to pass it to a prepared statement or callable statement, perhaps to insert into the database. This involves the use of ArrayDescriptor objects.

For more information about working with Oracle collections using the oracle.sql.ARRAY and ArrayDescriptor classes, see "Overview of Collection (Array) Functionality".

Overview of Classes oracle.sql.BLOB, oracle.sql.CLOB, oracle.sql.BFILE

BLOBs and CLOBs (referred to collectively as "LOBs"), and BFILEs (for external files) are for data items that are too large to store directly in a database table. Instead, the database table stores a locator that points to the location of the actual data.

The oracle.sql package supports these datatypes in several ways:

You can select a BLOB, CLOB, or BFILE locator from the database using a standard SELECT statement, but bear in mind that you are receiving only the locator, not the data itself. Additional steps are necessary to retrieve the data.

For information about how to access and manipulate locators and data for LOBs and BFILEs, see Chapter 7, "Working with LOBs and BFILEs".

Classes oracle.sql.DATE, oracle.sql.NUMBER, and oracle.sql.RAW

These classes map to primitive SQL datatypes, which are a part of standard JDBC, and supply conversions to and from the corresponding JDBC Java types. For more information, see the Javadoc.

Classes oracle.sql.TIMESTAMP, oracle.sql.TIMESTAMPTZ, and oracle.sql.TIMESTAMPLTZ

The Oracle9i JDBC drivers support the following date/time datatypes:

Oracle9i JDBC drivers allow conversions among DATE and date/time datatypes. For example, you can access a TIMESTAMPTZ column as a DATE value.

Oracle9i JDBC drivers support the most popular time zone names used in the industry as well as most of the time zone names defined in the JDK from Sun Microsystems. Time zones are specified by using the java.util.Calendar class.


Note:

Do not use TimeZone.getTimeZone to create a time zone object because there are more Oracle time zone names than Sun has defined in its JDK. 


The following code shows how the TimeZone and Calendar objects are created for US_PACIFIC, which is a time zone name not defined in the JDK:

TimeZone tz = TimeZone.getDefault();
tz.setID("US_PACIFIC");
GregorianCalendar gcal = new GregorianCalendar(tz);

The following classes are for the date/time data types:

Use the following methods from the oracle.jdbc.OraclePreparedStatement interface to set a date/time item:

Use the following methods from the oracle.jdbc.OracleCallableStatement interface to get a date/time item:

Use the following methods from the oracle.jdbc.OracleResultSet interface to get a date/time item:

Before accessing TIMESTAMPLTZ data, call the OracleConnection.setSessionTime() method to set the session time zone. When this method is called, the JDBC driver sets the session time zone of the connection and saves the session time zone so that any TIMESTAMPLTZ data accessed through JDBC can be adjusted using the session time zone.

Overview of Class oracle.sql.ROWID

This class supports Oracle ROWIDs, which are unique identifiers for rows in database tables. You can select a ROWID as you would select any column of data from the table. Note, however, that you cannot manually update ROWIDs--the Oracle database updates them automatically as appropriate.

The oracle.sql.ROWID class does not implement any noteworthy functionality beyond what is in the oracle.sql.Datum superclass. However, ROWID does provide a stringValue() method that overrides the stringValue() method in the oracle.sql.Datum class and returns the hexadecimal representation of the ROWID bytes.

For information about accessing ROWID data, see "Oracle ROWID Type".

Class oracle.sql.OPAQUE

The oracle.sql.OPAQUE class gives you the name and characteristics of the OPAQUE type and any attributes. OPAQUE types provide access only to the uninterrupted bytes of the instance.


Note:

For Oracle9i 9.0.1, there is minimal support for OPAQUE types. 


The following are the methods of the oracle.sql.OPAQUE class:

Package oracle.jdbc

The interfaces of the oracle.jdbc package provide Oracle-specific extensions to allow access to raw SQL format data by using oracle.sql.* objects.


Note:

The interfaces of the oracle.jdbc package replace the deprecated classes of the oracle.jdbc.driver package found in previous releases. (See "Package oracle.jdbc" for more information.) 


For the oracle.jdbc package, Table 5-2 lists key interfaces and classes used for connections, statements, and result sets.

Table 5-2 Key Interfaces and Classes of the oracle.jdbc Package  
Name  Interface or Class  Key Functionality 

OracleDriver 

Class 

implements java.sql.Driver 

OracleConnection 

Interface 

methods to return Oracle statement objects; methods to set Oracle performance extensions for any statement executed in the current connection (implements java.sql.Connection

OracleStatement 

Interface 

methods to set Oracle performance extensions for individual statement; superclass of OraclePreparedStatement and OracleCallableStatement (implements java.sql.Statement

OraclePreparedStatement 

Interface 

setXXX() methods to bind oracle.sql.* types into a prepared statement (implements java.sql.PreparedStatement; extends OracleStatement; superclass of OracleCallableStatement

OracleCallableStatement 

Interface 

getXXX() methods to retrieve data in oracle.sql format; setXXX() methods to bind oracle.sql.* types into a callable statement (implements java.sql.CallableStatement; extends OraclePreparedStatement

OracleResultSet 

Interface 

getXXX() methods to retrieve data in oracle.sql format (implements java.sql.ResultSet

OracleResultSetMetaData 

Interface 

methods to get meta information about Oracle result sets, such as column names and datatypes (implements java.sql.ResultSetMetaData

OracleDatabaseMetaData 

Class 

methods to get meta information about the database, such as database product name/version, table information, and default transaction isolation level (implements java.sql.DatabaseMetaData

OracleTypes 

Class 

defines integer constants used to identify SQL types. For standard types, it uses the same values as the standard java.sql.Types class. In addition, it adds constants for Oracle extended types. 

The remainder of this section describes the interfaces and classes of the oracle.jdbc package. For more information about using these interfaces and classes to access Oracle type extensions, see Chapter 6, "Accessing and Manipulating Oracle Data".

Class oracle.jdbc.OracleDriver

Use this class to register the Oracle JDBC drivers for use by your application. You can input a new instance of this class to the static registerDriver() method of the java.sql.DriverManager class so that your application can access and use the Oracle drivers. The registerDriver() method takes as input a "driver" class, that is, a class that implements the java.sql.Driver interface, as is the case with OracleDriver.

Once you register the Oracle JDBC drivers, you can create your connection using the DriverManager class. For more information on registering drivers and writing a connection string, see "First Steps in JDBC".

Interface oracle.jdbc.OracleConnection

This interface extends standard JDBC connection functionality to create and return Oracle statement objects, set flags and options for Oracle performance extensions, and support type maps for Oracle objects.

"Additional Oracle Performance Extensions" describes the performance extensions, including row prefetching, update batching, and metadata TABLE_REMARKS reporting.

Key methods include:

These oracle.jdbc.OracleConnection methods are Oracle-defined extensions:

Interface oracle.jdbc.OracleStatement

This interface extends standard JDBC statement functionality and is the superinterface of the OraclePreparedStatement and OracleCallableStatement classes. Extended functionality includes support for setting flags and options for Oracle performance extensions on a statement-by-statement basis, as opposed to the OracleConnection interface that sets these on a connection-wide basis.

"Additional Oracle Performance Extensions" describes the performance extensions, including row prefetching and column type definitions.

Key methods include:

These oracle.jdbc.OracleStatement methods are Oracle-defined extensions:

Interface oracle.jdbc.OraclePreparedStatement

This interface extends the OracleStatement interface and extends standard JDBC prepared statement functionality. Also, the oracle.jdbc.OraclePreparedStatement interface is extended by the OracleCallableStatement interface. Extended functionality consists of setXXX() methods for binding oracle.sql.* types and objects into prepared statements, and methods to support Oracle performance extensions on a statement-by-statement basis.

"Additional Oracle Performance Extensions" describes the performance extensions, including database update batching.

Key methods include:

Interface oracle.jdbc.OracleCallableStatement

This interface extends the OraclePreparedStatement interface (which extends the OracleStatement interface) and incorporates standard JDBC callable statement functionality.

Key methods include:

Interface oracle.jdbc.OracleResultSet

This interface extends standard JDBC result set functionality, implementing getXXX() methods for retrieving data into oracle.sql.* objects.

Key methods include:

Interface oracle.jdbc.OracleResultSetMetaData

This interface extends standard JDBC result set metadata functionality to retrieve information about Oracle result set objects. See "Using Result Set Meta Data Extensions" for information on the functionality of the OracleResultSetMetadata interface.

Class oracle.jdbc.OracleTypes

The OracleTypes class defines constants that JDBC uses to identify SQL types. Each variable in this class has a constant integer value. The oracle.jdbc.OracleTypes class duplicates the typecode definitions of the standard Java java.sql.Types class and contains these additional typecodes for Oracle extensions:

As in java.sql.Types, all the variable names are in all-caps.

JDBC uses the SQL types identified by the elements of the OracleTypes class in two main areas: registering output parameters, and in the setNull() method of the PreparedStatement class.

OracleTypes and Registering Output Parameters

The typecodes in java.sql.Types or oracle.jdbc.OracleTypes identify the SQL types of the output parameters in the registerOutParameter() method of the java.sql.CallableStatement interface and oracle.jdbc.OracleCallableStatement interface.

These are the forms that registerOutputParameter() can take for CallableStatement and OracleCallableStatement (assume a standard callable statement object cs):

cs.registerOutParameter(int index, int sqlType);

cs.registerOutParameter(int index, int sqlType, String sql_name);

cs.registerOutParameter(int index, int sqlType, int scale);

In these signatures, index represents the parameter index, sqlType is the typecode for the SQL datatype, sql_name is the name given to the datatype (for user-defined types, when sqlType is a STRUCT, REF, or ARRAY typecode), and scale represents the number of digits to the right of the decimal point (when sqlType is a NUMERIC or DECIMAL typecode).


Note:

The second signature is standard under JDBC 2.0 in a JDK 1.2.x environment, but is an Oracle extension under JDK 1.1.x. 


The following example uses a CallableStatement to call a procedure named charout, which returns a CHAR datatype. Note the use of the OracleTypes.CHAR typecode in the registerOutParameter() method (although java.sql.Types.CHAR could have been used as well).

CallableStatement cs = conn.prepareCall ("BEGIN charout (?); END;");
cs.registerOutParameter (1, OracleTypes.CHAR);
cs.execute ();
System.out.println ("Out argument is: " + cs.getString (1));

The next example uses a CallableStatement to call structout, which returns a STRUCT datatype. The form of registerOutParameter() requires you to specify the typecode (Types.STRUCT or OracleTypes.STRUCT), as well as the SQL name (EMPLOYEE).

The example assumes that no type mapping has been declared for the EMPLOYEE type, so it is retrieved into a STRUCT datatype. To retrieve the value of EMPLOYEE as an oracle.sql.STRUCT object, the statement object cs is cast to an OracleCallableStatement and the Oracle extension getSTRUCT() method is invoked.

CallableStatement cs = conn.prepareCall ("BEGIN structout (?); END;");
cs.registerOutParameter (1, OracleTypes.STRUCT, "EMPLOYEE");
cs.execute ();

// get the value into a STRUCT because it 
// is assumed that no type map has been defined
STRUCT emp = ((OracleCallableStatement)cs).getSTRUCT (1);
OracleTypes and the setNull() Method

The typecodes in Types and OracleTypes identify the SQL type of the data item, which the setNull() method sets to NULL. The setNull() method can be found in the java.sql.PreparedStatement interface and the oracle.jdbc.OraclePreparedStatement interface.

These are the forms that setNull() can take for PreparedStatement and OraclePreparedStatement objects (assume a standard prepared statement object ps):

ps.setNull(int index, int sqlType);

ps.setNull(int index, int sqlType, String sql_name);

In these signatures, index represents the parameter index, sqlType is the typecode for the SQL datatype, and sql_name is the name given to the datatype (for user-defined types, when sqlType is a STRUCT, REF, or ARRAY typecode). If you enter an invalid sqlType, a Parameter Type Conflict exception is thrown.


Note:

The second signature is standard under JDBC 2.0 in a JDK 1.2.x environment, but is an Oracle extension under JDK 1.1.x. 


The following example uses a PreparedStatement to insert a NULL numeric value into the database. Note the use of OracleTypes.NUMERIC to identify the numeric object set to NULL (although Types.NUMERIC could have been used as well).

PreparedStatement pstmt =
    conn.prepareStatement ("INSERT INTO num_table VALUES (?)");

pstmt.setNull (1, OracleTypes.NUMERIC);
pstmt.execute ();

In this example, the prepared statement inserts a NULL STRUCT object of type EMPLOYEE into the database.

PreparedStatement pstmt = conn.prepareStatement 
                               ("INSERT INTO employee_table VALUES (?)");

pstmt.setNull (1, OracleTypes.STRUCT, "EMPLOYEE");
pstmt.execute ();

Oracle Interfaces for Oracle-specific Features

The oracle.jdbc interfaces introduced in Oracle9i are recommended alternatives to the classes by the same name in the oracle.jdbc.driver package in older releases. These interfaces essentially duplicate the functionality in the oracle.jdbc.driver package.

The following example shows how the oracle.jdbc package is used to cast pstmt as an Oracle type:

java.sql.PreparedStatement pstmt
  = conn.prepareStatement(...);

((oracle.jdbc.OraclePreparedStatement) pstmt)
  .setExecuteBatch(10);   // Oracle-specific method

Method getJavaSqlConnection()

The getJavaSqlConnection() method of the oracle.sql.* classes returns java.sql.Connection while the getConnection() method returns oracle.jdbc.driver.OracleConnection. Because the methods that use the oracle.jdbc.driver package are deprecated, the getConnection() method is also deprecated in favor of the getJavaSqlConnection() method.

For the following Oracle datatype classes, the getJavaSqlConnection() method was added:

The following shows the getJavaSqlConnection() and the getConnection() methods in the Array class:

public class ARRAY
{
  // New API
  //
  java.sql.Connection getJavaSqlConnection()
    throws SQLException;

  // Deprecated API.  It throws a SQLException
  //
  oracle.jdbc.driver.OracleConnection
    getConnection() throws SQLException;

  ...
}

Package oracle.jdbc2 (for JDK 1.1.x only)

The oracle.jdbc2 package is an Oracle implementation for use with JDK 1.1.x, containing classes and interfaces that mimic a subset of standard JDBC 2.0 classes and interfaces (which exist in the JDK 1.2 version of the standard java.sql package).

The following interfaces are implemented by oracle.sql.* type classes for JDBC 2.0-compliant Oracle type extensions under JDK 1.1.x.

In addition, the oracle.jdbc2 package includes the following interfaces for users employing the JDBC-standard SQLData interface to create Java classes that map to Oracle objects. Again, these interfaces mimic java.sql interfaces available with JDK 1.2:

The SQLData interface is one of the two facilities you can use to support Oracle objects in Java. (The other choice is the Oracle ORAData interface, included in the oracle.sql package.) See "Understanding the SQLData Interface" for more information about SQLData, SQLInput, and SQLOutput.

Oracle Character Datatypes Support

Oracle character datatypes include the SQL CHAR and SQL NCHAR datatypes. The following sections describe how these datatypes can be accessed using the Oracle JDBC drivers.

SQL CHAR Datatypes

The SQL CHAR datatypes include CHAR, VARCHAR2, and CLOB. These datatypes allow you to store character data in the database character set encoding scheme. The character set of the database is established when you create the database.

SQL NCHAR Datatypes

SQL NCHAR datatypes were created for Globalization Support (formerly NLS). SQL NCHAR datatypes include NCHAR, NVARCHAR2, and NCLOB. These datatypes allow you to store unicode data in the database NCHAR character set encoding. The NCHAR character set, which never changes, is established when you create the database. See the Oracle9i Globalization Support Guide for information on SQL NCHAR datatypes.


Note:

Because the UnicodeStream class is deprecated in favor of the CharacterStream class, the setUnicodeStream() and getUnicodeStream() methods are not supported for NCHAR datatype access. Use the setCharacterStream() method and the getCharacterStream() method if you want to use stream access. 


The usage of SQL NCHAR datatypes is similar to that of the SQL CHAR (CHAR, VARCHAR2, and CLOB) datatypes. JDBC uses the same classes and methods to access SQL NCHAR datatypes that are used for the corresponding SQL CHAR datatypes. Therefore, there are no separate, corresponding classes defined in the oracle.sql package for SQL NCHAR datatypes. Likewise, there is no separate, corresponding constant defined in the oracle.jdbc.OracleTypes class for SQL NCHAR datatypes. The only difference in usage between the two datatypes occur in a data bind situation: a JDBC program must call the setFormOfUse() method to specify if the data is bound for a SQL NCHAR datatype.


Note:

For Oracle9i 9.0.1, the setFormOfUse() method must be called before the registerOutParameter() method is called in order to avoid unpredictable results. 


The following code shows how to access SQL NCHAR data:

// 
// Table TEST has the following columns: 
// - NUMBER 
// - NVARCHAR2 
// - NCHAR 
// 
oracle.jdbc.OraclePreparedStatement pstmt = 
  (oracle.jdbc.OraclePreparedStatement) 
conn.prepareStatement("insert into TEST values(?, ?, ?)");

// 
// oracle.jdbc.OraclePreparedStatement.FORM_NCHAR should be used for all NCHAR, 
// NVARCHAR2 and NCLOB data types.
//
pstmt.setFormOfUse(2, FORM_NCHAR);
pstmt.setFormOfUse(3, FORM_NCHAR);

pstmt.setInt(1, 1);                    // NUMBER column
pstmt.setString(2, myUnicodeString1);  // NVARCHAR2 column
pstmt.setString(3, myUnicodeString2);  // NCHAR column
pstmt.execute();

Class oracle.sql.CHAR

The CHAR class is used by Oracle JDBC in handling and converting character data. The JDBC driver constructs and populates oracle.sql.CHAR objects once character data has been read from the database.


Note:

The oracle.sql.CHAR class is used for both SQL CHAR and SQL NCHAR datatypes. 


The CHAR objects constructed and returned by the JDBC driver can be in the database character set, UTF-8, or ISO-Latin-1 (WE8ISO8859P1). The CHAR objects that are Oracle object attributes are returned in the database character set.

JDBC application code rarely needs to construct CHAR objects directly, since the JDBC driver automatically creates CHAR objects as character data are obtained from the database. There may be circumstances, however, where constructing CHAR objects directly in application code is useful--for example, to repeatedly pass the same character data to one or more prepared statements without the overhead of converting from Java strings each time.

oracle.sql.CHAR Objects and Character Sets

The CHAR class provides Globalization Support functionality to convert character data. This class has two key attributes: (1) Globalization Support character set and (2) the character data. The Globalization Support character set defines the encoding of the character data. It is a parameter that is always passed when a CHAR object is constructed. Without the Globalization Support character set being know, the bytes of data in the CHAR object are meaningless.

The oracle.sql.CharacterSet class is instantiated to represent character sets. To construct a CHAR object, you must provide character set information to the CHAR object by way of an instance of the CharacterSet class. Each instance of this class represents one of the Globalization Support character sets that Oracle supports. A CharacterSet instance encapsulates methods and attributes of the character set, mainly involving functionality to convert to or from other character sets. You can find a complete list of the character sets that Oracle supports in the Oracle9i Globalization Support Guide.

When constructing a CHAR object, there are limitations to which character sets you can use. If you are constructing a CHAR object for a unicode column (NCHAR, NVARCHAR2, and NCLOB), then use the database character set. If you are constructing an CHAR object for a CHAR, VARCHAR, or VARCHAR2 column, use one of the character sets in Table 5-3.

Table 5-3 Character Sets for SQL CHAR Datatypes 
Character Set  Use if... 

US7ASCII 

the database character set is US7ASCII 

WE8ISO8859P1 

the database character set is WE8ISO8859P1 

UTF8 

the database character set is not US7ASCII or WE8ISO8859P1 

If you are constructing a CHAR object for NCHAR datatypes, use the database NCHAR character set.

Constructing an oracle.sql.CHAR Object

Follow these general steps to construct a CHAR object:

  1. Create a CharacterSet object by calling the static CharacterSet.make() method.

    This method is a factory for the character set instance. The make() method takes an integer as input, which corresponds to a character set ID that Oracle supports. For example:

    int oracleId = CharacterSet.JA16SJIS_CHARSET; // this is character set ID,
                                                  // 832
    ...
    CharacterSet mycharset = CharacterSet.make(oracleId);
    
    

    Each character set that Oracle supports has a unique, predefined Oracle ID.


    Note:

    If you enter an invalid character set ID, an exception will not be thrown. Instead, you will receive unpredictable results. 


    For more information on character sets and character set IDs, see the Oracle9i Globalization Support Guide.

  2. Construct a CHAR object.

    Pass a string (or the bytes that represent the string) to the constructor along with the CharacterSet object that indicates how to interpret the bytes based on the character set. For example:

    String mystring = "teststring";
    ...
    CHAR mychar = new CHAR(teststring, mycharset);
    
    

    The CHAR class has multiple constructors--they can take a string, a byte array, or an object as input along with the CharacterSet object. In the case of a string, the string is converted to the character set indicated by the CharacterSet object before being placed into the CHAR object.

    See the oracle.sql.CHAR class Javadoc for more information.


    Notes:

    • The CharacterSet object cannot be null.

    • The CharacterSet class is an abstract class, therefore it has no constructor. The only way to create instances is to use the make() method.

    • The server recognizes the special value CharacterSet.DEFAULT_CHARSET as the database character set. For the client, this value is not meaningful.

    • Oracle does not intend or recommend that users extend the CharacterSet class.

     

oracle.sql.CHAR Conversion Methods

The CHAR class provides the following methods for translating character data to strings:

The server (a database) and the client, or application running on the client, can use different character sets. When you use the methods of the CHAR class to transfer data between the server and the client, the JDBC drivers must convert the data from the server character set to the client character set or vice versa. To convert the data, the drivers use Globalization Support. For more information on how the JDBC drivers convert between character sets, see "JDBC and Globalization Support".

Additional Oracle Type Extensions

See other chapters in this book for information about key Oracle type extensions:

This section covers additional Oracle type extensions and concludes with a discussion of differences between the current Oracle JDBC drivers and the Oracle 8.0.x and 7.3.x drivers regarding support of Oracle extensions.

Oracle JDBC drivers support the Oracle-specific BFILE and ROWID datatypes and REF CURSOR types, which were introduced in Oracle7 and are not part of the standard JDBC specification. This section describes the ROWID and REF CURSOR type extensions. See Chapter 7 for information about BFILEs.

ROWID is supported as a Java string, and REF CURSOR types are supported as JDBC result sets.

Oracle ROWID Type

A ROWID is an identification tag unique for each row of an Oracle database table. The ROWID can be thought of as a virtual column, containing the ID for each row.

The oracle.sql.ROWID class is supplied as a wrapper for type ROWID SQL data.

ROWIDs provide functionality similar to the getCursorName() method specified in the java.sql.ResultSet interface, and the setCursorName() method specified in the java.sql.Statement interface.

If you include the ROWID pseudo-column in a query, then you can retrieve the ROWIDs with the result set getString() method (passing in either the column index or the column name). You can also bind a ROWID to a PreparedStatement parameter with the setString() method. This allows in-place updates, as in the example that follows.


Note:

The oracle.sql.ROWID class replaces oracle.jdbc.driver.ROWID, which was used in previous releases of Oracle JDBC. 


Example: ROWID

The following example shows how to access and manipulate ROWID data.

Statement stmt = conn.createStatement(); 

// Query the employee names with "FOR UPDATE" to lock the rows. 
// Select the ROWID to identify the rows to be updated. 

ResultSet rset =  
   stmt.executeQuery ("SELECT ename, rowid FROM emp FOR UPDATE"); 

// Prepare a statement to update the ENAME column at a given ROWID 

PreparedStatement pstmt = 
   conn.prepareStatement ("UPDATE emp SET ename = ? WHERE rowid = ?"); 

// Loop through the results of the query 
while (rset.next ()) 
{ 
    String ename = rset.getString (1); 
    oracle.sql.ROWID rowid = rset.getROWID (2);  // Get the ROWID as a String 
    pstmt.setString (1, ename.toLowerCase ()); 
    pstmt.setROWID (2, rowid); // Pass ROWID to the update statement 
    pstmt.executeUpdate ();     // Do the update 
} 

Oracle REF CURSOR Type Category

A cursor variable holds the memory location (address) of a query work area, rather than the contents of the area. Declaring a cursor variable creates a pointer. In SQL, a pointer has the datatype REF x , where REF is short for REFERENCE and x represents the entity being referenced. A REF CURSOR, then, identifies a reference to a cursor variable. Because many cursor variables might exist to point to many work areas, REF CURSOR can be thought of as a category or "datatype specifier" that identifies many different types of cursor variables.

To create a cursor variable, begin by identifying a type that belongs to the REF CURSOR category. For example:

DECLARE TYPE DeptCursorTyp IS REF CURSOR

Then create the cursor variable by declaring it to be of the type DeptCursorTyp:

dept_cv DeptCursorTyp  - - declare cursor variable
...
 

REF CURSOR, then, is a category of datatypes, rather than a particular datatype.

Stored procedures can return cursor variables of the REF CURSOR category. This output is equivalent to a database cursor or a JDBC result set. A REF CURSOR essentially encapsulates the results of a query.

In JDBC, REF CURSORs are materialized as ResultSet objects and can be accessed as follows:

  1. Use a JDBC callable statement to call a stored procedure. It must be a callable statement, as opposed to a prepared statement, because there is an output parameter.

  2. The stored procedure returns a REF CURSOR.

  3. The Java application casts the callable statement to an Oracle callable statement and uses the getCursor() method of the OracleCallableStatement class to materialize the REF CURSOR as a JDBC ResultSet object.

  4. The result set is processed as requested.


    Important:

    The cursor associated with a REF CURSOR is closed whenever the statement object that produced the REF CURSOR is closed.

    Unlike in past releases, the cursor associated with a REF CURSOR is not closed when the result set object in which the REF CURSOR was materialized is closed. 


Example: Accessing REF CURSOR Data

This example shows how to access REF CURSOR data.

import oracle.jdbc.*;
...
CallableStatement cstmt;
ResultSet cursor;

// Use a PL/SQL block to open the cursor
cstmt = conn.prepareCall
         ("begin open ? for select ename from emp; end;");

cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
cursor = ((OracleCallableStatement)cstmt).getCursor(1);

// Use the cursor like a normal ResultSet
while (cursor.next ())
    {System.out.println (cursor.getString(1));} 

In the preceding example:

For a full sample application using a REF CURSOR, see "REF CURSORs--RefCursorExample.java".

Support for Oracle Extensions in 8.0.x and 7.3.x JDBC Drivers

Some of the Oracle type extensions supported by the current Oracle JDBC drivers are either not supported or are supported differently by the Oracle 8.0.x and 7.3.x JDBC drivers. The following are the key points:

Table 5-4 summarizes these differences. "OracleTypes Definition" refers to static typecode constants defined in the oracle.jdbc.OracleTypes class.

Table 5-4 Support for Oracle Type Extensions, 8.0.x and 7.3.x JDBC Drivers 
Oracle Datatype  OracleTypes Definition  Type Extension,
Current Drivers
 
Type Extension,
8.0.x/7.3.x drivers
 

NUMBER 

OracleTypes.NUMBER 

oracle.sql.NUMBER 

no type extension for wrapper class 

CHAR 

OracleTypes.CHAR 

oracle.sql.CHAR 

no type extension for wrapper class 

RAW 

OracleTypes.RAW 

oracle.sql.RAW 

no type extension for wrapper class 

DATE 

OracleTypes.DATE 

oracle.sql.DATE 

no type extension for wrapper class 

ROWID 

OracleTypes.ROWID 

oracle.sql.ROWID 

oracle.jdbc.driver.OracleRowid 

BLOB 

OracleTypes.BLOB 

oracle.sql.BLOB 

oracle.jdbc.driver.OracleBlob in 8.0.x;
not supported in 7.3.x 

CLOB 

OracleTypes.CLOB 

oracle.sql.CLOB 

oracle.jdbc.driver.OracleClob in 8.0.x;
not supported in 7.3.x 

BFILE 

n/a 

oracle.sql.BFILE 

oracle.jdbc.driver.OracleBfile in 8.0.x;
not supported in 7.3.x 

structured object 

OracleTypes.STRUCT 

oracle.sql.STRUCT or custom class 

not supported 

object reference 

OracleTypes.REF 

oracle.sql.REF or custom class 

not supported 

collection (array) 

OracleTypes.ARRAY 

oracle.sql.ARRAY or custom class 

not supported 

OPAQUE 

OracleTypes.OPAQUE 

oracle.sql.OPAQUE 

not supported 


Go to previous page Go to next page
Oracle
Copyright © 1996-2001, Oracle Corporation.

All Rights Reserved.
Go To Documentation Library
Home
Go To Product List
Solution Area
Go To Table Of Contents
Contents
Go To Index
Index