Manual for the Oracle Server JDBC drivers
Version: 3.05
Last Modified: 2. Oct 2009
Table of Content
This is a documentation of the i-net JDBC drivers for the Oracle Server. It
includes the drivers
- i-net ORANXO(tm) JDBC 3.0 Driver
- i-net SEROPTO(tm) JDBC 2.0 Driver with Optional Package
- i-net SERO(tm) JDBC 2.0 Driver
- i-net AUGURO(tm) JDBC 1.22 Driver
Extract the driver jar file from the zip file you have purchased or
downloaded. The name of the jar file is like the drivername. It can be:
- Oranxo.jar
- Seropto.jar
- Sero.jar
- Auguro.jar
Add the driver jar file to your classpath or extract the jar file in the
directory of the application.
Add the driver jar file to the Archive attribute of the applet tag, e.g.:
<APPLET CODE="..." Codebase="..." ARCHIVE="Oranxo.jar" WIDTH="100%" HEIGHT="100%">
...
</APPLET>
or extract the jar file in the directory of the applet. You need a
browser compatible with the needed JDK. Some browsers support JDK 1.1.x, only. A
solution is to use the Java Plugin. In this case you need to use the OBJECT tag
(IE) or the EMBED tag (NC).
Please note:
If you want to employ connection pooling or datasources, and you do not use
at least JDK 1.3.x (J2SE Version 1.3), you need to make sure...
| Product |
minimum required JDK version |
JDBC Version |
| Oranxo |
1.4.0 |
3.0 |
| Seropto |
1.2.x |
2.0 + Optional Package |
| Sero |
1.2.x |
2.0 |
| Auguro |
1.1.x |
1.22 |
All drivers support the following Oracle Server Versions:
- Oracle Server 10g
- Oracle Server 9i
- Oracle Server 8i
- Oracle Server 8
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.
The class name of the driver is: com.inet.ora.OraDriver
The class name of the pooled driver included in i-net Seropto(tm) and
i-net Oranxo(tm) is:
com.inet.pool.PoolDriver
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
Note: All properties are case sensitive.
There are two ways to put the properties to the driver:
- append the properties to the URL like this:
jdbc:inetora:hostname:portnumber?user=username&password=passwd
- 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 |
the port on which the server is listen |
| 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 ) |
| 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. |
| 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. Note: This property will work for i-net SERO,
i-net SEROPTO and i-net ORANXO only. |
| 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. |
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();
}
...
You will find more examples in the dictionary /samples.
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 occured 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.
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
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();
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".
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)
Escape Clauses allow the developer to create statements in a database
independent manner. The JDBC Driver converts the sequences as neccessary.
{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();
{call storedProcedure1( ?, ?, ...)}
{? = call storedProcedure2( ?, ?, ...)}
Example:
cs = con.prepareCall( "{? = call MyProcedure( ? )}" );
cs.registerOutParameter( 1, Types.VARCHAR );
cs.setString( 2, "example" );
cs.execute();
cs.close();
The following functions are supported. You can find more info at
http://java.sun.com/products/jdbc/driverdevs.html.
Example:
st = con.createStatement();
rs = st.executeQuery( "select * from all_users where username
like {fn ucase( 'scott' )}" );
...
rs.close();
st.close();
{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()}
{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()}
{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()}
{fn database()}
{fn ifnull()}
{fn user()}
{fn convert()}
{oj table1 LEFT OUTER JOIN table2 ON table1.id =
table2.id}
{oj table1 RIGHT OUTER JOIN table2 ON table1.id = table2.id}
{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();
2. Example:
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();
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 |
Not supported in this release.
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
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.
Insert Strings to NCLOB/NVARCHAR/NCHAR columns
If codepage of server instance don't support multilingual characters, N___
columns work like their ASCII equivalents.
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.
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
- 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)
Please read this file and our FAQ at
http://www.inetsoftware.de/products/jdbc/oracle/faq.htm
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 |
| i-net ORANXO |
oranxo at inetsoftware.de |
| i-net SEROPTO |
seropto at inetsoftware.de |
| i-net SERO |
sero at inetsoftware.de |
| i-net AUGURO |
auguro 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/
- The driver has been completely redesigned.
- 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.
- 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 occured 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.
- 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.
- 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.
- 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.
- 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 occured if the count of
inserted rows [insertRow()] was larger than the fetchsize. The exception
occured 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
- 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.
- 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 behaviour 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.
- 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.
- 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.
- Included a workaround for a java.lang.IllegalAccessError that occured 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 occured with PreparedStatement reexecution with
Blob/Clob parameter. Also internal Exception caused by free lob locators
already released are solved with this fix.
- Behaviour 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
- 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()
- 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.
- 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.
- 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)) ).
- 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.
- 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 occured only with streamstolob=true.
- 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.
Copyright by i-net software
More info and updates can be found at http://www.inetsoftware.de
© 1998-2009 i-net software