Manual for the Oracle Server JDBC drivers

Version: 4.06
Last Modified: 6. Apr 2023

1. Description

This is a documentation of the i-net JDBC drivers for the Oracle Server. It includes the drivers

  • i-net ORANXO™ JDBC 3.0 Driver

2. Installation

Extract the driver jar file from the zip file you have purchased or downloaded. The name of the jar file is Oranxo.jar. Add the jar file to the classpath of your application.

2.1. Using the Driver in a Java Application

Add the driver jar file to your classpath or extract the jar file in the directory of the application.

3. Getting Started

3.1. Oracle Server, Java and JDBC Versions

minimum required JDK version JDBC Version
1.4 3.0
1.6 4.0

The driver support the following Oracle Server Versions:

  • Oracle Server 19c
  • Oracle Server 12c
  • Oracle Server 11g
  • Oracle Server 10g
  • Oracle Server 9i
  • Oracle Server 8i
  • Oracle Server 8

3.2. Check Host Name and Port Number of Your Server

This driver works with Oracle Servers that are configured to use the TCP/IP networking protocol. Please verify that your server is currently listening on a TCP/IP port.

If you know that your Oracle Server listens on a TCP/IP port and you know the host name of your Oracle Server and the port number you can go to the next chapter.

The default port number for the Oracle SQL Server is usually 1521. However, servers can be configured to listen on any port number.

To make sure that the Oracle server listens on the machine name and port number you specified use:

telnet <hostname or ip address> <port number>

If the connection is refused then the hostname or the port number is incorrect.

3.3. Driver Class Name

The class name of the driver is: com.inet.ora.OraDriver

The class name of the pooled driver is: com.inet.pool.PoolDriver

3.4. JDBC URL Syntax of the Driver

jdbc:inetora:hostname:portnumber:sid
jdbc:inetora:hostname:portnumber:SQL*NET config
jdbc:inetora:hostname:portnumber
jdbc:inetora:hostname
jdbc:inetora

If you do not specify the hostname, the portnumber or the service, the following defaults are set:

hostname: localhost
portnumber: 1521
sid: orcl

Example:
jdbc:inetora:www.inetsoftware.de:1521:orcl

Additional you can append one or more properties to the URL

Example:
jdbc:inetora:www.inetsoftware.de:1521:orcl?traceLevel=2
jdbc:inetora:www.inetsoftware.de:1521:orcl?traceLevel=2&alterSession=true

3.5. Implemented Driver Properties

Note: All properties are case sensitive.

There are two ways to put the properties to the driver:

  1. append the properties to the URL like this:
    jdbc:inetora:hostname:portnumber?user=username&password=passwd
  2. call of method getConnection(String url, Properties info) from the driver manager.
Name Default Description
user scott the database user
password tiger password of the database user
host localhost the database host
port 1521 (tcp)
2484 (tcps)
the port on which the server is listen
protocol tcp The communication protocol. Possible values are tcp and tcps. With tcps the driver is using SSL encryption.
initSQL null This expression is executed once per connection.
failover false if set on true, the driver connects to alternative hosts, if connecting failed
loadbalance value of failover property if set on true, driver connects to one of the given hosts
host[N] <host> an additional host for failover/loadbalance or Oracle Connection Manager if failover is not activated.
port[N] <port> an additional port for failover/loadbalance or Oracle Connection Manager if failover is not activated.
cm false enable the source route for Oracle Connection Manager. You can't use it together with failover=true
sid orcl the insance name of the database
service the network servicename of a database. See the service_names parameter in init.ora (or init<dbName>.ora) file. If you set both, sid and service name, the service name will be used for connection.
sduSize 2920 the maximum packet size the driver is sending
logonMode normal logon mode for the user sys ( normal, sysdba, sysoper )
<BOOKMARK:reportUnsupportedMethods>reportUnsupportedMethods false if set to true the driver throws exceptions on unsupported methods. The list of the unsupported methods can be found here.
logging false if set to true, the driver is calling DriverManager.setLogStream( System.out ) if no other logstream is set
tracePackets false if set to true, the driver dumps out the network packets
program drivername programname (appears in v$session)
mapNumbers true If set to true, getObject() on number column returns objects depending on the columns precision. If set to false it will return instances of BigDecimal always.
ignoreScale false If set to true, getObject(x) and getDecimal(x) will ignore the scale of the column definition for a numeric value. It will return a BigDecimal with the scale set dynamically according to the value. The scale can be different for every row. This is a little faster.
alterSession false if set to true, the driver alters the session depending on the clients locale
dedicated false if set to true, the driver tries to get dedicated connections
tables false if set to true, the driver use temporary tables for scrollable resultsets in case it cannot get the affected rowids
description “” for free use
caseSensitive false if set to true, the driver treats column and table names case sensitive
loginTimeout Override the value of DriverManager.getLoginTimeout()
queryTimeout 5*loginTimeout Default value for Statement.setQueryTimeout()
streamstolob false Change stream parameter to CLOB/BLOB parameter to make it compatible with this data types. Without it streams are only compatible until 4000 bytes.
timestampToDate false If the Java parameter Timestamp should convert to the Oracle data type DATE. This both data types are not 100% compatible. For example for usage of indexes. This parameter has an effect for PreparedStatement parameters and the ts escape clause.
opencursors 300 The value is only used if you have no access to the table v$parameter.

3.6. Connection Example

  import java.sql.*; // JDBC package
 
  ...
 
  String url = "jdbc:inetora:host:port"; // use your hostname and port number here
  String login = "scott"; // use your login here
  String password = "tiger"; // use your password here
 
  ...
 
  try {
      DriverManager.setLogStream(System.out); // to create more info 
      // for technical support
 
      //load the class with the driver
      //Class.forName("com.inet.ora.OraDriver"); // JDK,Netscape
      //or
      //Class.forName("com.inet.ora.OraDriver").newInstance(); // DK,Netscape,IE
      //or
      new com.inet.ora.OraDriver(); // JDK,Netscape,IE
 
      //set a timeout for login and query
      DriverManager.setLoginTimeout(15);
 
      //open a connection to the database
      Connection connection = DriverManager.getConnection(url,login,password);
 
      //to get the driver version
      DatabaseMetaData conMD = connection.getMetaData();
      System.out.println("Driver Name:\t" + conMD.getDriverName());
      System.out.println("Driver Version:\t" + conMD.getDriverVersion());
 
      //create a statement
      Statement st = connection.createStatement();
 
      //execute a query
      ResultSet rs = st.executeQuery("SELECT * FROM tblExample");
 
      // read the data and put it to the console
      while (rs.next()){
          for(int j=1; j<=rs.getMetaData().getColumnCount(); j++){
              System.out.print( rs.getObject(j)+"\t");
          }
          System.out.println(); 
      }
 
      //close the objects
      st.close();
      connection.close();
 
  } catch(Exception e) {
      e.printStackTrace();
  }
  ...

3.7. More Connection Example

You will find more examples in the dictionary /samples.

3.8. Monitored Failover

With the interface FailoverListener it is possible to manage the reconnection process. This can be used with a single Oracle Server and a cluster (RAC). The FailoverListener receives an event if the connection was broken, if the reconnection process was successful and if an error occurred during the attempt to reconnect. Depending on the value returned from FailoverListener, a new attempt of reconnection will be started or not.
The Connection tries to reconnect to the same server with the same properties. If reconnection was successful, all Statements, PreparedStatements and CallableStatements will be restored. The ResultSets won't be restored. In order to restore those, you have to execute the Statement again.
For more information see com.inet.pool.PoolManager.addFailoverListener(), com.inet.pool.FailoverListener, com.inet.pool.FailoverEvent and sample.MonitoredFailover.

3.8.1. Configuration via Connection properties

There are multiple possibilities about how to configure the Monitored Failover. It is possible to use the default implementation of the FailoverListener or to use your own implementation.
The default FailoverListener is similar to the TimedFailoverListener in the samples package. To every created Connection automatically an instance of the configured FailoverListener will be added.

Set a FailoverListener via Connection properties:

Name Default Description
useDefaultFailoverListener false if set to true, a default FailoverListener will be added automatically to every Connection
waitTimeToNextAttempt 500 property for the default FailoverListener. Sets the time to wait in millis, that will be wait to the next reconnect attempt.
totalTimeOfAttempts 30 property for the default FailoverListener. Sets the total time in seconds, in that the reconnection process must be finished.
failoverListener - the class name of your own FailoverListener implmeentation. This class has to implement the FailoverListener interface AND the default public constructor. This is important to create a new instance of this class via reflection.

Example URLs:

  • jdbc:inetpool:inetora:localhost?database=orcl&useDefaultFailoverListener=true&waitTimeToNextAttempt=100&totalTimeOfAttempts=10
  • jdbc:inetpool:inetora:localhost?database=orcl&failoverListener=test.MyFirtsFailoverListener

3.8.2. Configuration in Java

For more flexibility it is also possible to manage the registered FailoverListener of a Connection in Java. A FailoverListener can be only added to a Connection, that implements the interface TAFConnection. Those Connection can be received from:

com.inet.pool.PoolDriver,
com.inet.ora.PDataSource,
com.inet.tds.PDataSource,
com.inet.syb.PDataSource,
com.inet.drda.PDataSource.

The interface TAFConnection allows you to add and remove a FailoverListener to/from the Connection.

Example:

  //receive a Connection 
  Class.forName("com.inet.pool.PoolDriver");
  Connection con = DriverManager.getConnection("jdbc:inetpool:inetora:localhost?database=orcl", "scott", "tiger");
  //add a FailoverListener
  FailoverListener fl = new samples.CounteredFailoverListener(99);
  ((TAFConnection)con).addFailoverListener(fl);

  //remove a FailoverListener
  ((TAFConnection)con).removeFailoverListener(fl);

  //remove all FailoverListener
  ((TAFConnection)con).removeAllFailoverListener();

  //get all registered FailoverListener
  FailoverListener[] fls = getFailoverListener();

3.9. Connection Failover, Connection Load Balancing

If you use connection failover and load balancing for oracle cluster (RAC), you will have to set the URL property “failover” to true and add a list of alternative cluster nodes to the URL.

Example URL:

jdbc:inetora:localhost:1521:ORCL?failover=true&host1=node2&port1=1521&host2=node3&port2=1521

jdbc:inetora:localhost:1521?service=myClusterServiceName&failover=true&host1=node2&port1=1521&host2=node3&port2=1521

In this URL the following connection possibilities are listed:

localhost:1521
node2:1521
node3:1521

“failover=true” activates connection failover and load balancing.
Connection failover means, the driver has a list of hosts to which he can connect. If one connection fails, he tries the next connection.
Load balancing means, the driver starts trying to connect not in the order of the host list but in a random order.

If you want to use connection failover without load balancing, set “failover=true” and “loadbalance=false”. To use load balancing without connection failover, set “failover=false” and “loadbalance=true”.

3.10. Get Generated Keys

If you want to get the generated keys after you executed a statement there are three ways to do this.

  • Statement.execute(String, Statement.RETURN_GENERATED_KEYS) and Statement.executeUpdate(String, Statement.RETURN_GENERATED_KEYS) will return the values of all columns of the table row updated (Note: the pseudocolumn ROWID will not be returned)
  • Statement.execute(String, int[]) and Statement.executeUpdate(String int[]) will return the same result like above
  • Statement.execute(String, String[]) and Statement.executeUpdate(String, String[]) will return the values of all specified columns of the table row updated (Note: the pseudocolumn ROWID can also be used)

4. Escape Clauses

Escape Clauses allow the developer to create statements in a database independent manner. The JDBC Driver converts the sequences as neccessary.

4.1. Date, Time and Timestamp

{d 'yyyy-mm-dd'}
{t 'hh:mm:ss'}
{ts 'yyyy-mm-dd hh:mm:ss'}

Example:
st = con.createStatement();
st.executeUpdate( “insert into date_tab( d1 ) values( {ts '2002-12-10 13:30:05'} )” );
st.close();

4.2. Stored Procedures

{call storedProcedure1( ?, ?, …)}
{? = call storedProcedure2( ?, ?, …)}

Example:
cs = con.prepareCall( “{? = call MyProcedure( ? )}” );
cs.registerOutParameter( 1, Types.VARCHAR );
cs.setString( 2, “example” );
cs.execute();
cs.close();

4.3. Functions

The following functions are supported.

Example:

st = con.createStatement();
rs = st.executeQuery( "select * from all_users where username like {fn ucase( 'scott' )}" );
...
rs.close();
st.close();

4.3.1. Numeric Functions

{fn abs()}
{fn acos()}
{fn asin()}
{fn atan()}
{fn atan2()}
{fn ceiling()}
{fn cos()}
{fn cot()}
{fn degrees()}
{fn exp()}
{fn floor()}
{fn log()}
{fn log10()}
{fn mod()}
{fn pi()}
{fn power()}
{fn radians()}
{fn rand()}
{fn round()}
{fn sign()}
{fn sin()}
{fn sqrt()}
{fn tan()}
{fn truncate()}

4.3.2. String Functions

{fn ascii()}
{fn char()}
{fn concat()}
{fn insert()}
{fn lcase()}
{fn left()}
{fn length()}
{fn locate()}
{fn ltrim()}
{fn repeat()}
{fn replace()}
{fn right()}
{fn rtrim()}
{fn soundex()}
{fn space()}
{fn substring()}
{fn ucase()}

4.3.3. Time and Date Functions

{fn curdate()}
{fn curtime()}
{fn dayname()}
{fn dayofmonth()}
{fn dayofweek()}
{fn dayofyear()}
{fn hour()}
{fn minute()}
{fn month()}
{fn monthname()}
{fn now()}
{fn quarter()}
{fn second()}
{fn timestampadd()}
{fn week()}
{fn year()}

4.3.4. System Functions

{fn database()}
{fn ifnull()}
{fn user()}

4.3.5. Conversion Functions

{fn convert()}

4.4 Outer Join

{oj table1 LEFT OUTER JOIN table2 ON table1.id = table2.id}
{oj table1 RIGHT OUTER JOIN table2 ON table1.id = table2.id}

4.5 Escape

{escape 'char'}

1. Example:

st = con.createStatement();
rs = st.executeQuery( "select name from vendors where name like 'one/_word' {escape '/'} " ); //searching for "one_word"
...
rs.close();
st.close();
</code java>
 2. Example:
<code>
st = con.createStatement();
rs = st.executeQuery( "select name from vendors where name like '%one/%word' {escape '/'} "); //searching for strings ending with "one%word"
...
rs.close();
st.close();

5. Debugging and Exceptions

5.1. SQL States

The following Oracle errors produces SQL states as listed below:

Oracle error SQL State Description
913, 947 21S01 insert value list does not match column list
1401, 1406 22001 data tranction / value out of range
1426, 1438, 1455, 1457 22003 numeric value out of range
1476 22012 division by zero
1, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299 23000 integrity constraint violation
900, 923 37000 syntax or access violation
955 S0001 base table or view already exists
942 S0002 base table not found
1430 S0021 column already exist
904 S0022 column not found
all other S1000 general error

5.2. Driver specific Codes

Not supported in this release.

6. Oracle Connection Manager

To use the Oracle Connection Manager you need 3 additional parameters:

  • cm=true
  • port1=<port>
  • host1=<host>

You only need to set either one of host1 or port1

Syntax:
jdbc:inetora:<cm host>:<cm port>:<sid>?host1=<db host>&port1=<port>

Examples:
jdbc:inetora:localhost:1630:ORCL?host1=localhost&port1=1521
jdbc:inetora:localhost:1630:ORCL?port1=1521

7. The parameter opencursors and PreparedStatements

First, the driver requests the table v$parameter to read the current value of open_cursors from the Oracle Server. If the current user has no right to acess the table v$parameter then the driver will use the default values of the Oracle Server. These are 50 for Oracle 8.0.x and 300 for Oracle 8.1.x or higher, resp. By means of the JDBC URL or DataSource parameter opencursors these values can be overwritten.

The driver uses 50% of this opencursors value for cursor and prepared cursor pooling. A cursor is needed for every SQL expression, ResultSet and trigger. The driver uses only 50% of this value for pooling, resulting in a reserve for possible triggers.

If you need more cursors then the driver will recycle all unused cursors in its pool in the first place. If all cursors in the pool are used then the driver will create a new cursor. If you are done with the use of a cursor and the pool is full then the cursor is closed and not returned to the pool.

Example1:

opencursors has a value of: 300
50% of opencursor is: 150
open ResultSets: 149
unused PreparedStatement cursors: 1

Now you execute a new PreparedStatement
–> The driver unprepares the PreparedStatement in the pool and uses the cursor for the new PreparedStatement.
–> After the execution of the PreparedStatement the cursor is marked as unused.

Example2:

opencursors has a value of: 300
50% of opencursor is: 150
open ResultSets: 150

Now you execute a new PreparedStatement
–> The driver opens a new cursor. Now the driver is using 151 cursors.
–> After the execution of the PreparedStatement the cursor is closed because the pool has already the max size of 150.

The parameter opencursors limits only the open cursors in the cursor pool. Of course, you can use more than 50% of opencursors. But when you close a ResultSet or the execution of a Statement is finished then the cursor is closed and the cursor is not returned to the pool because the max size of the pool is already reached.

The driver will not throw an exception if the limit is reached. Only the database will throw an exception if the open_cursors value of the database is exceeded.

Disable PreparedStatement pooling

You can disable the PreparedStatement pooling with a value of 2 for opencursors. A value of 0 means an unlimited pool size.

8. Known problems

8.1 Insert Strings to NCLOB/NVARCHAR/NCHAR columns

If codepage of server instance don't support multilingual characters, N___ columns work like their ASCII equivalents.

8.2 writing Strings > 4k to NCLOB

Because driver has to define exactly which LOB type the target column is, driver sends Strings always in the way defined for CLOB columns.

Streaming large Strings to NCLOB column will be possible with JDBC4 implementation of driver in new future. There exists special setN___ functions, so that driver know that target column is NCLOB.

8.3 Unsupported Methods

There are some Methods of the JDBC API which are not supported by this driver. The driver property reportUnsupportedMethods will decide what the methods do. If the driver property is not set or set to “false” the call will be ignored. If the property is set to “true” an SQLException will be thrown by the methods. The list of the methods not supported is listed below:

  • class java.sql.CallableStatement
    • getURL(int)
  • class java.sql.Connection
    • releaseSavepoint(Savepoint)
    • setCatalog(String)
    • setHoldability(int)
    • setReadOnly(boolean)
    • setTypeMap(Map)
  • class java.sql.ResultSet
    • getCursorName()
    • setFetchDirection(int)
  • class java.sql.Statement
    • setCursorName(String)
    • setFetchDirection(int)

9. Support

Please read this file and our FAQ at http://www.inetsoftware.de/products/jdbc-driver/oracle/faq

In case you would like to file a support request please contact the appropriate address (replace at with @):

Licensing, Pricing, Updates, … sales at inetsoftware.de
technical questions oranxo at inetsoftware.de

Please provide us with the following information:

  • the release number of the driver
  • please provide the stacktrace (ex.printStacktrace();)
  • if there is an exception, please use the command DriverManager.setLogStream(System.out)
  • please provide the employed parameters in the JDBC URL
  • please give information about the virtual machine or browser
  • a script sample in order to reproduce the error, if necessary
  • SQL scripts in order to reproduce the error, if necessary

Thank you very much for your collaboration.

The latest support information are available at: http://www.inetsoftware.de/support

10. Changes

10.1. Changes from 1.xx to 2.00

  • The driver has been completely redesigned.

10.2. Changes in Version 2.01

  • A bug with Clob.setString() and ClobWriter.flush() was fixed.
  • A bug with saving of clobs/blobs with Oracle 8.0.x was fixed.
  • Support for insertRow() with CLOB/BLOB was added.
  • Support for getColumnClassName() was added.
  • Support for getRow() after insertRow() was added.
  • Support for getBinaryStream() and getBytes with BLOB was added.
  • An ArrayIndexOutOfBoundsException with large SQL expressions was fixed.
  • A bug with the timestamp escape sequence was fixed (ORA-01830: date format picture ends before converting entire input string).
  • A bug with call escape sequence and parameter count was fixed.
  • An ArrayIndexOutOfBoundsException was fixed with insertRow(), TYPE_SCROLL_INSENSITIVE and if not all columns was updated.
  • A bug with getRow() and isXXX() with readonly, forwardonly ResultSets was fixed.
  • The method getColumnType() has not returned the mapped data types for numeric data types (mapNumber=true).
  • A bug with the oj escape sequence and where clause was fixed.
  • The INNER JOIN syntax was added to the oj escape syntax.
  • A bug with count(*) and TYPE_SCROLL_SENSITIVE was fixed.

10.3. Changes in Version 2.02

  • The error “not enough arguments for function” with escape functions was fixed.
  • A bug with the method updateString, insensitive updateable result sets and clob columns was fixed. The exception “unimplemented or unreasonable conversion requested” had occurred before fixing.
  • A bug with the method DatabaseMetaData.getIndexInfo was fixed. It now uses quotation marks for the identifiers if the value of the JDBC url property “columnsCaseSensitive” is true.
  • A bug with the string function {fn locate()} was fixed (order of parameters).
  • Nested escape functions was added.
  • The data type number(1) maps to Byte now and not to Boolean.
  • A protocol violation was fixed (when an output parameter in the database was not registered in the driver).
  • The properties cm, hostN and portN was added.

10.4. Changes in Version 2.03

  • The methods getXXX returns the value of a previous updateXXX on an insert row.
  • setPortNumber() and getPortNumber() were added.
  • A bug with executeBatch() in version 2.02 was fixed.
  • Property loginTimeout and queryTimeout were added.
  • Support for PreparedStatement.setString( “String larger 4000” ) was added.
  • ResultSet.next() uses the query timeout and not the login timeout now.
  • PreparedStatement pooling was added.

10.5. Changes in Version 2.04

  • The return class of CallableStatement.getObject() after registerOutParameter(Types.FLOAT) was changed to Double.
  • A bug with the escape sequence “escape” was fixed.
  • The return value for getScale() of FLOAT is 0 now.
  • A case sensitivity problem with some DatabaseMetaData methods was fixed.
  • A NullPointerException with getIndexInfo() was fixed.
  • The method PreparedStatement.getMetaData() was implemented.
  • The method getParameterMetaData() was implemented.
  • All DDL statements were removed from PreparedStatement pool because the Oracle Server can execute it ony once. In general it is faster to use simple Statements instead of PrepareadStatements for DDL statements.
  • A ClassCastException with {fn ucase()} was fixed.
  • The property opencursors was added.
  • A rounding for floating point numbers (double or float) was added.
  • After executeBatch() the batch is cleared now.
  • The error message “missing mandatory parameter” was fixed.
  • ResultSetMetaData.getColumnType() return Types.FLOAT for the data type FLOAT instead Types.DOUBLE now.
  • A bug that updateRow() not clear the parameter was fixed.
  • Support for national characters logins was added.
  • The escape function convert supports the types SQL_xxx now.

10.6. Changes in Version 2.05

  • The driver uses temporay LOB objects for CLOB / BLOB support.
  • Support for Clob as SP parameter was added.
  • The exeception “java.lang.InstantiationException: com.inet.ora.f” with SEROPTO was fixed.
  • A java.lang.StackOverflowError was fixed with CallableStatement.getBytes() and CallableStatement.getBlob() if the output value is from data type BLOB.
  • A bug with PreparedStatement and 2 large strings (> 4000 bytes or > 1333 bytes of unicode) was fixed. The driver could hang or throw an exception.
  • Support for SQL*NET connection strings was added.
  • A bug with stored procedures and large strings (> 4000 bytes or > 1333 bytes on unicode) (wrong order of parameters) was fixed. The large string parameter had been sent as last parameter.
  • A very rare ArrayIndexOutOfBoundsException with specific data was fixed.
  • A rounding problem with getDouble() and very large mantisses was fixed. For example for 9221120237041090560.
  • Increased Performance for reading the data of Blob.getBinaryStream().
  • A very rare row order problem with updatable ResultSets was fixed.
  • The error “Not on a valid row.” with CachedRowSet was fixed.
  • The error “ORA-01000: maximum open cursors exceeded” was fixed for Updateable ResultSets and not closed Resultsets from PreparedStatements.
  • Support for nanos with data type TIMESTAMP(9) was added.
  • The error “Not supported type with setObject …” with Types.CLOB and Types.BLOB was fixed.
  • A bug with streams of Oracle 9 multibyte systems was fixed.
  • The Property “columnCaseSensitive” was changed to “caseSensitive”.
  • The PreparedStatement pool is cleared after an “ALTER TABLE”. This does not apply to open ResultSets from PreparedStatments.
  • The methods getStreamstolob() and setStreamstolob(String) have been added.
  • The BatchUpdateException now gets the sqlstate and vendorcode if available.
  • SqlState for 01400 and 1401 changed to “23000”.
  • SqlState for 01700 - 1799 changed to “42000”.
  • SqlState for 01800 - 1899 changed to “22008”.
  • A StringIndexOutOfBoundsException on getConnection() was fixed.
  • The return value of getUpdateCount() after a call getMoreResults() had been wrong.
  • The return value of getColumnDisplaySize() for NUMBER had been wrong.
  • Now setTransactionIsolation() throws an exception if the connection is part of an XA transaction.
  • A leak in temporary tablespace with user lob class files was fixed.
  • The error “ORA-01000: maximum open cursors exceeded” was fixed for the case that many SQLExceptions occur, you create many ResultSets and lose the reference. Now the driver runs a garbage collection before this error occurs.
  • Support for the NVARCHAR2/NCHAR with Oracle 9.x was added.
  • A bug with Connection Manager and rules in the file cman.ora was fixed.
  • An ArrayIndexOutOfBoundsException with scrollable ResultSets and an external deleted row was fixed.

10.7. Changes in Version 2.06

  • Support for ResultSet.getArray(x) was added.
  • The return value of getColumnType() was changed from Types.VARCHAR to Types.CHAR for the data types char and nchar.
  • Change of the CLOB encoding for UTF8 databases with the database version 8.1.7.0 < version < 9.0.0.0.
  • Support for ResultSet.relative() and ResultSet.absolute() if the ResultSet is TYPE_FORWARD_ONLY and the row addressed is reachable by a sequence of ResultSet.next().
  • A bug in DatabaseMetaData, that a schema/table was not found if schema or table name contained '�'was fixed.
  • The methods “getColumnPrivileges(String, String, String, String)” and “getColumns(String, String, String, String)” from DatabaseMetaData supports ignore case for columnNamePattern.
  • DatabaseMetaData now returns as size the value 4GB (4294967296) in the ResultSet of getColumns() for CLOB, BLOB, NCLOB, BFILE
  • Property timestampToDate was added.
  • PreparedStatement.getMetaData() returns null for non SELECT expressions now.
  • A Bug that produced a deadlock when a Connection is locked and non closed PreparedStatements got unprepare from Finalizer was fixed.
  • A bug with Oracle 8.1.x that Timestamp values with nanos could corrupt the next parameter of a PreparedStatement was fixed.
  • setAsciiStream and setUnicodeStream now supports the “StreamsToLob” property.
  • A Bug that produced unpredictable errors, because of reusing cursors from closed invalid PreparedStatements was fixed
  • A bug that Date and Timestamp values before 1900 was saved with a wrong century was fixed.
  • A Bug that the scale of value from ResultSet.getBigDecimal was rounded up to next even number when a column was defined with an uneven number was fixed
  • An ArrayIndexOutOfBoundException was fixed that occurred if the count of inserted rows [insertRow()] was larger than the fetchsize. The exception occurred in the getXXX() methods.
  • A bug with ResultSet.relative() with move before the first row was fixed.
  • A bug that updateable Resultset have only 64 rows was fixed.
  • A cursor pool corruption was fixed when a user called ResultSet.close() or Statement.close() in a finalize() method.
  • A Bug that DatabaseMetaData.getUDTs() returns always an empty ResultSet was fixed.
  • A very rare ArrayIndexOutOfBoundsException with negative double values was fixed. The problem could only occur with large packets like with batch updates.
  • Fixes in isAfterLast and isBeforeFirst for empty Resultsets

10.8. Changes in Version 2.07

  • DatabaseMetaData.getColumns() returns the correct data type for NCHAR and NVARCHAR2 columns now.
  • The return value of the methods supportsOpenCursorsAcrossCommit(), supportsOpenStatementsAcrossCommit(), and supportsOpenStatementsAcrossRollback() were changed to true.
  • DatabaseMetaData.getProcedures() now returns all stored procedures if all parameters are null. The schemaPattern does not have to be case sensitive any longer.
  • The prepared cursor pool has too many cursors unprepared. This was only a performance problem.
  • The method ResultSet.getBinaryStream(x).available() returns the correct value now. Before the value has always been 0.
  • The method ResultSet.getBigDecimal() returned numbers with wrong decimal point if the number was divisible by 100. (since 2.06).
  • The method PreparedStatement.setObject(x, byte[], Types.LONGVARBINARY) always maps to LONG RAW now. Before the mapping depended on the size of the byte array.
  • The bug that executeBatch() ignored setEscapeProcessing(false) was fixed.
  • The JDBC URL parameter timestampToDate has also an effect for the ts escape clause now.
  • Batch update works also with LONG RAW Binary with different length of the single values (larger or smaller 4000 bytes) now.
  • Support for Oracle Server 10g implemented.
  • PreparedStatements and CallableStatements send numeric values now as type number and not as type string.
  • Sql state “07001” was added for SQLExceptions, if the number of set parameters are not correct for PreparedStatements/CallableStatements.
  • The driver lost the scale of numbers from a UNION. Now it returns the correct value.
  • Error messages from oracle servers will decode now by utf-8 if possible.
  • BigDecimal values will be normalized before sent to server.
  • The bug, that cancel() didn't stop the current statement but the following is fixed.
  • BigDecimal values with more than the maximum of 42 numerics getting up rounded was corrected.

10.9. Changes in Version 2.08

  • A bug that BigDecimal with values like point zero could be saved as wrong value was fixed.
  • getProcedureColumns() returns Types.FLOAT instead of Types.OTHER if the type is FLOAT.
  • getProcedureColumns() now changes the given parameter to upper case.
  • getProcedures() now doesn't ignore the caseSensitive property.
  • A NullPointerException in CachedRowSet.getObject() after a serialize of the CachedRowSet was fixed.
  • Bugfix in escape function decoding engine. If a parameter of an escape function was yet another escape function, then the following parameter used to be ignored.
  • Bugfix in escape function decoding engine. Escape function REPEAT didn't work with table columns.
  • Bugfix in escape function decoding engine. CONVERT to integer, smallint and tinyint no longer returns numbers with decimal places.
  • Bugfix in escape function decoding engine. MONTHNAME and DAYNAME no longer return values with a fixed length of nine characters.
  • Bugfix in escape function decoding engine. In TIMESTAMPDIFF the paramaters used to be inverted. Also small differences of hours, minutes and seconds used to be always 0.
  • The types BLOB and CLOB were added to the result of getTypeInfo().
  • The return values of ResultSetMetaData.getPrecision() were changed.
  • Added connection failover and load balancing.
  • setTransactionIsolation( TRANSACTION_NONE ) now uses TRANSACTION_READ_COMMITTED.
  • The behavior of updateXXX(), getXXX() and updateRow() was changed in CachedRowSet.
  • An ArrayIndexOutOfBoundsException with the setXXX() methods of the RowSets was fixed (used to be thrown when the parameter was not set in numerical order)
  • Support for getGeneratedKeys() was added.
  • Correct handling for SID and network service name in connection URL.
  • Performance improve with reading of CLOBs and BLOBs.
  • A precision bug with setDouble was fixed.
  • A bug with closed connections and XA transactions was fixed.
  • A bug with Blob/Clob in batches was fixed.

10.10. Changes in Version 2.09

  • A bug with reading NCLOBs was fixed.
  • Some setter and getter methods were added to PDataSource, that were requiered to configure the loadbalancing and failover on application servers.
  • A bug with setAutoCommit(false) and setTransactionIsolationLevel(int) was fixed.
  • The following methods from Connection now throws an SQLException if the connection is in auto-commit mode: rollback(), rollback(Savepoint), setSavePoint(), setSavePoint(String)
  • The default value of property “failover” changed to false.
  • A bug that didn't provide free cursors from cursor pool has been fixed.
  • A Bug that has throw an “Stored procedure does not return values.” Exception if the BLOB data has a size of 32512 has been fixed.
  • A Bug that setTime(), setDate(), setTimestamp() with Calendar parameter send wrong data if the date was inside the clock change, has been fixed.

10.11. Changes in Version 2.10

  • The bug that loadbalancing in conjunction with a DataSource didn't work has been fixed.
  • The bug that failover in conjunction with a DataSource didn't work has been fixed.
  • The bug that the Time Object from ResultSet.getTime(int,Calendar) contained Date.
  • The SQL state of SQLException “ORA-01089” was changed to “08S01”. The change was necessary for the MonitoredFailover mechanism.
  • The com.inet.pool.TimedFailoverListener / DefaultFailoverListener calculated the end of reconnect process too early.
  • The bug that ResultSet.getTime(int,Calendar) returned a wrong time has been fixed.
  • com.inet.ora.OraDriver.getPropertyInfo() returns all possible parameter now.
  • Lifetime of temporary LOBs (CLOB/BLOB) was increased. That fixed a problem with a LOB parameter of a function.
  • A bug with PreparedStatement.addBatch() and String parameter was fixed. Now you can use the same PreparedStatement for strings less and more than 1334 charcaters. Previously you had to use one for small and one for large strings. Otherwise an Exception “The data type of parameter <paramIdx> was changed.” had been thrown.
  • PreparedStatement.setObject with Types.CLOB, additional value classes are allowed: String, char[], byte[], InputStream
  • PreparedStatement.setObject with Types.BLOB, additional value classes are allowed: String, byte[], InputStream
  • IPv6 support prepared for future Oracle 11g.
  • Fix in ResultSetMetaData.getColumnClassName(), “java.sql.Timestamp” was written wrong.
  • A bug in DatabaseMetaData.getColumns() for data type TIMESTAMP(x) was fixed. The return data type was Types.OTHER for this data type.
  • Now only port1 or host1 must be set for failover.

10.12. Changes in Version 2.11

  • Included a workaround for a java.lang.IllegalAccessError that occurred in a weblogic JVM with Clob.lenght() implementation.
  • Solved a problem with String to double conversion. String values with a slash (e.g.“111.111/E-004”)now can be converted.
  • Solved problem of storing strings in database with GB18030 charset.
  • Solved a memory leak occurred with PreparedStatement reexecution with Blob/Clob parameter. Also internal Exception caused by free lob locators already released are solved with this fix.
  • Behavior change for input parameter that are streams. Those parameter have to reset for every execution.
  • Some increments for Boolean class in PreparedStatement.setObject(int, Object, int, int) and PreparedStatement.setObject(int, Object, int) function.
  • Various Exception were thrown because large String parameter(nearly 32k) were not streamed.
  • DatabaseMetaData,getProcedureColumns() now returns the right sql types for “BINARY_INTEGER”, “NVARCHAR2”, “NCHAR”, “BLOB” and “CLOB” parameters.
  • A precision problem with setFloat() was fixed.
  • ResultSet.setObject(Boolean) and ResultSet.setObject(InputStream)will work now.
  • Extended information in DriverPropertyInfo

10.13. Changes in Version 2.12 (27. Sep 2006)

  • Driver.getPropertyInfo() don't throw a NoSuchElementException anymore if the set URL not complete.
  • Out cursor of stored procedures now can be TYPE_SCROLL_INSENSITIVE is CallableStatement was created with this type.
  • Updateable ResultSets use a minimum count of server cursors for submit and validate updates.
  • IllegalAccessException fixed when trying to access DatabaseMetaData method via reflection.
  • A regression with SPs and strings larger 1333 characters with multi byte charsets was fixed.
  • A bug in reading a Blob/Clob value from the InputStream of the Blob/Clob causing an Exception has been fixed.
  • A bug updating a Blob/Clob column of a ResultSet with a byte[]/String/InputStream causing an Exception has been fixed.
  • A bug updating a Clob with updateAsciiStream/updateCharacterStream causing an Exception has been fixed.
  • Updating a Clob object directly could have caused an Exception.
  • BigDecimal values of zero with a scale grater than one could cause an Exception when used as PreparedStatement parameter.
  • Parameters of PreparedStatemends was bind to wrong data types. This has produce conversion errors together with SQL functions.
  • DatabaseMetaData.getProcedureColumns() returned Types.OTHER instead of Types.TIMESTAMP for the data type Timestamp
  • Statement.getGeneratedKeys() did not return any generated keys if the statement was executed with Statement.execute()

10.14. Changes in Version 3.00 (14. Mar 2007)

  • DatabaseMetaData.getProcedureColumns() did not ignore the schema pattern if null was passed, but it used the SYSTEM schema only.
  • Creating a Connection with a Properties object could cause the following problems:
    • Specifying an empty value for “loginTimeout” caused a NumberFormatException
    • Specifying an empty value for “loadbalance” did not activate load balancing if failover was enabled.
  • The error “[Oracle] #23 ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error” on method Clob.getCharacterStream() with multi byte codepages was fixed.
  • An error while reading/writing high precision double values has been fixed.
  • JDBC4 interface was added for i-net ORANXO.

10.15. Changes in Version 3.01 (13. Sep 2007)

  • An ArrayIndexOutOfBoundsException: 1 >= 1 on getConnection() was fixed. It occurred if there was both a failover and a non-failover datasource configuration at the same time.
  • A timeout exception did not cancel the statement on the server.
  • A NumberFormatException with negative zero values (-0.0) was fixed.

10.16. Changes in Version 3.02 (6. Mar 2008)

  • Instances of PDataSource could not have been serialized.
  • The value of the BatchUpdateException.getUpdateCounts() was ever empty for PreparedStatement.executeBatch().
  • Parameters placeholder in SQL comments are skip now.
  • The method ResultSet.getStatment() returns the Statement also on closed ResultSets now.
  • The method getUpdateCount() after a call of executeBatch() returns the total update count now.
  • The method getBigDecimal() work also with columns with negative scale (for example CREATE TABLE test (num number(5,-1)) ).

10.17. Changes in Version 3.03 (8. Oct 2008)

  • Connections remained open if the Oracle session had been killed by an administrator. Now the connection will be closed if a terminated session has been detected.
  • Updateable ResultSets now use fewer cursors. This improves performance.

10.18. Changes in Version 3.04 (25. Mar 2009)

  • Concatenating LOB columns could lead to a hangup. For example “SELECT clob_column || 'any string' FROM xyz” would hang up the process.
  • A bug with executeBatch(), setCharacterStream() and short streams was fixed. The length of the last stream was assumed for all streams.
  • Support for reading TIMESTAMP WITH TIME ZONE added.
  • A bug in setBinaryStream() and empty streams (length = 0) was fixed. The error occurred only with streamstolob=true.

10.19. Changes in Version 3.05 (2. Oct 2009)

  • Fixed a bug with large strings with updateString() and the data type LONG.
  • ResultSets from stored procedures ignored settings from Statement such as the query timeout.
  • DatabaseMetaData.getColumns() ignored the schema pattern for synonyms.
  • Fixed the method getGeneratedKeys() after a call of Statement.updateString(String, x ).
  • Support Strings larger than 32KB for updatable ResultSets.

10.20. Changes in Version 3.06 (14. Apr 2010)

  • A bug in ResultSet.updateObject( x, Object ) with large strings and large byte arrays was fixed.

10.21. Changes in Version 3.07 (15. Oct 2010)

  • The property ignoreScale was added.

10.22. Changes in Version 3.08 (23. Mar 2011)

  • A rare freeze up problem was fixed.

10.23. Changes in Version 3.09 (26. Oct 2011)

  • A bug in the escaping of prepared statements with comment syntax “/” was fixed.
  • Property protocol was added. Possible values are tcp and tcps.

10.24. Changes in Version 3.10 (30. Mar 2012)

  • The update count of BatchUpdateExceptions was corrected.
  • Added support for ORA-28002: the password will expire within X days.

10.25. Changes in Version 3.11 (12. Oct 2012)

  • ResultSetMetaData now returns the right values for the N data types, specifically for the methods getColumnType() and getColumnTypeName().

10.26. Changes in Version 3.12 (17. Apr 2013)

  • Fix a connection bug with protocol=tcps and a cipher suites for non anonymous auth.

10.27. Changes in Version 3.13 (9. Apr 2014)

  • The streamed LOB methods setBlob(x,Reader) and setClob(x,InputStream) without a stream length was fix.

10.28. Changes in Version 3.14 (15. Apr 2015)

  • Very rare protocol violation with error message “Read beyond buffer limit.” was fixed.
  • Very rare protocol violation with CLOB values < 254 bytes was fixed.

10.29. Changes in Version 3.15 (19. Apr 2016)

  • Changed the SQL for the escape function {fn TIMESTAMPDIFF}.
  • Prevent a corrupt connection after a query timeout.

10.30. Changes in Version 4.00 (22. Mar 2017)

  • The error “ORA-28040: No matching authentication protocol” with Oracle 12c was fixed.

10.31. Changes in Version 4.01 (30. Apr 2018)

  • Fix “java.lang.StringIndexOutOfBoundsException: String index out of range: 36” with Oracle version 11.2.0.3.0.
  • Remove a warning message from Java 9.

10.32. Changes in Version 4.02 (22. Apr 2019)

  • Fix ORA-01007 through reusing of statements as a result of an ALTER TABLE on a different connection.
  • Handle the warning “ORA-28002 The Password Will Expire” on login.

10.33. Changes in Version 4.03 (20. Mar 2020)

  • Added JDBC 4.1 methods.
  • Fix a StringIndexOutOfBoundsException with multibyte database encoding and unicode characters in a data type of CHAR.
  • Prevent a endless loop with a broken socket inside getConnection().

10.34. Changes in Version 4.04 (13. Apr 2021)

  • Perfomance of DatabaseMetaData.getTables() improved.
  • Perfomance of DatabaseMetaData.getProcedures() improved.

10.35. Changes in Version 4.05 (11. Apr 2022)

  • Support LocalDateTime values for setObject(i,x).
  • Add reconnect to the pooled driver also to the DatabaseMetaData API.

10.36. Changes in Version 4.06 (6. Apr 2023)

  • Small performance optimizing.

11. Copyright

Copyright by i-net software
More info and updates can be found at http://www.inetsoftware.de

© 1998-2023 i-net software

 

© Copyright 1996 - 2024, i-net software; All Rights Reserved.