Array Inserts with Java?

Hey,
Just doing some forward thinking for a project and ran into a
question that I can't seem to find a straight forward answer to.
I'll be importing data from a flat file structure and want to
make it as fast as possible to process as it may be a large set
of records.
Can Java (JDev 2.0) do array inserts. I'd like to achieve
something like PRO*C in that I want to be able to pass an array
of records to insert, batching them so that it's not a single
network (or database) hit per record inserted.
Any help appriciated!
Doug
null

Doug,
I think any kind of mass inserting is not going to be optimal
over JDBC.
I am pretty sure the batch update just saves you some network
roundtrips. I believe each insert/update would still be a
separate transaction once on the server side, if nothing else for
the purposes of rollbacks, etc.
-L
Doug Gault (guest) wrote:
: Guys,
: Thanks for the quick response.
: I had run into the Batch Update facility but on my initial
: reading it seemed to be more about compacting network traffic
: rather than enhancing mass insert performance.. Did I get the
: wrong end of the stick here?
: What (roughly) happens to the 'Batched' set of transactions
once
: the Database gets it. Is the set processed as a single
: transaction (all or nothing)?
: I'll re-read this section, and take a look at the Tech net
: examples
: Thanks
: Doug
: JDeveloper Team (guest) wrote:
: : Doug,
: : I ran into problems with trying to pass arrays. Namely, with
: : stored procedures, JDBC treats an array argument as an
attempt
: to
: : declare an IN/OUT type parameter, and only allows that array
to
: : contain one object.
: : The JDBC doc has a section on performance enhancements that
you
: : may want to investigate, specifically the Batch Update
facility
: : described in Chapter 4 in the 'Additional Oracle Extensions'
: : section. You can use this to 'batch up sets of inserts or
: : updates' rather than send them one at a time.
: : Alternately, I recommend you check out the JDBC sample code
: : provided on OTN. They have some better 'real world' examples
: : than the JDBC docs.
: : -L
null

Similar Messages

  • Oracle table(s) data to INSERT(String) statements with JAVA

    Hi,
    How can I get sql inserts from a oracle table with JAVA?
    Is there a Oracle API for it?
    I need to store it in a file, the result file should have these examples lines:
    -- INSERTING into TEST
    Insert into "TEST" ("CODE","FAMILY","SUB_FAMILY","SEVERITY","STATUS","ANOMALY_DATE","DESCRIPTION",
    "COMMENTS","VALUE0","VALUE1","VALUE2","VALUE3","VALUE4","VALUE5","VALUE6","VALUE7","VALUE8",
    "VALUE9") values (1,'family1','subFamily11','bad','initial',to_date('0005-11-21','DD/MM/RR'),'someDescription',
    'someComment','someValue','someValue','someValue','uselessValue','uselessValue',null,null,null,null,null);
    the example line was created with the export tool from Oracle SQl developer
    Thks.
    Francisco

    user9046632 wrote:
    Hi Guys, this is me Francisco that wrote the first question, but now I've an NEW account. I'll try to explain it. For a Job I need a .txt file that contains the SQl string inserts from an Oracle Table. I can't use a Software because I need to do it with Java Code. I'm not trying to get the inserts's logging , I need a to export it from a table.I read One way to do it is using DataPump utility, but using this tools, will I get a text file? I read that DataPump works with binaries files. using Java JDBC and metadata, I need to convert all in String file, ok for it I'm agree, but I have to write a lot of code to know what kind of type I get from the Table to parse it. One example is with Date types, oracle softwares parse it as to_date('0005-11-21','DD/MM/RR') and java toTostrig will do it something like '2009-1-25 13:00:00'. Java toString method will truncate some Number types So I need to know if someone did it or give or can help me.
    Thank you very much. Francisco
    Again, explain the business problem you are trying to solve, not the technical one. WHY do you need a text file that contains "SQL string inserts"? It sounds very much like you are looking at your problem "through the wrong end of the telescope" and thus finding a poorly designed solution. But unless we know the real problem to be solved, it's hard to say any more than that this smells bad.
    Sorry about my English, it's not my natural language

  • How to handle blob data with java and mysql and hibernate

    Dear all,
    I am using java 1.6 and mysql 5.5 and hibernate 3.0 . Some time i use blob data type . Earlier my project's data base was oracle 10g but now i am converting it to Mysql and now i am facing problem to save and fetch blob data to mysql database . Can anybody give me the source code for blob handling with java+Mysql+Hibernate
    now my code is :--
    ==================================================
    *.hbm.xml :--
    <property name="image" column="IMAGE" type="com.shrisure.server.usertype.BinaryBlobType" insert="true" update="true" lazy="false"/>
    ===================================================
    *.java :--
    package com.shrisure.server.usertype;
    import java.io.OutputStream;
    import java.io.Serializable;
    import java.sql.Blob;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Types;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    import oracle.sql.BLOB;
    import org.hibernate.HibernateException;
    import org.hibernate.usertype.UserType;
    import org.jboss.resource.adapter.jdbc.WrappedConnection;
    import com.google.gwt.user.client.rpc.IsSerializable;
    public class BinaryBlobType implements UserType, java.io.Serializable, IsSerializable {
    private static final long serialVersionUID = 1111222233331231L;
    public int[] sqlTypes() {
    return new int[] { Types.BLOB };
    public Class returnedClass() {
    return byte[].class;
    public boolean equals(Object x, Object y) {
    return (x == y) || (x != null && y != null && java.util.Arrays.equals((byte[]) x, (byte[]) y));
    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
    BLOB tempBlob = null;
    WrappedConnection wc = null;
    try {
    if (value != null) {
    Connection oracleConnection = st.getConnection();
    if (oracleConnection instanceof oracle.jdbc.driver.OracleConnection) {
    tempBlob = BLOB.createTemporary(oracleConnection, true, BLOB.DURATION_SESSION);
    if (oracleConnection instanceof org.jboss.resource.adapter.jdbc.WrappedConnection) {
    InitialContext ctx = new InitialContext();
    DataSource dataSource = (DataSource) ctx.lookup("java:/DefaultDS");
    Connection dsConn = dataSource.getConnection();
    wc = (WrappedConnection) dsConn;
    // with getUnderlying connection method , cast it to Oracle
    // Connection
    oracleConnection = wc.getUnderlyingConnection();
    tempBlob = BLOB.createTemporary(oracleConnection, true, BLOB.DURATION_SESSION);
    tempBlob.open(BLOB.MODE_READWRITE);
    OutputStream tempBlobWriter = tempBlob.getBinaryOutputStream();// setBinaryStream(1);
    tempBlobWriter.write((byte[]) value);
    tempBlobWriter.flush();
    tempBlobWriter.close();
    tempBlob.close();
    st.setBlob(index, tempBlob);
    } else {
    st.setBlob(index, BLOB.empty_lob());
    } catch (Exception exp) {
    if (tempBlob != null) {
    tempBlob.freeTemporary();
    exp.printStackTrace();
    st.setBlob(index, BLOB.empty_lob());
    // throw new RuntimeException();
    } finally {
    if (wc != null) {
    wc.close();
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
    final Blob blob = rs.getBlob(names[0]);
    return blob != null ? blob.getBytes(1, (int) blob.length()) : null;
    public Object deepCopy(Object value) {
    if (value == null)
    return null;
    byte[] bytes = (byte[]) value;
    byte[] result = new byte[bytes.length];
    System.arraycopy(bytes, 0, result, 0, bytes.length);
    return result;
    public boolean isMutable() {
    return true;
    public Object assemble(Serializable arg0, Object arg1) throws HibernateException {
    return assemble(arg0, arg1);
    public Serializable disassemble(Object arg0) throws HibernateException {
    return disassemble(arg0);
    public int hashCode(Object arg0) throws HibernateException {
    return hashCode();
    public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
    return replace(arg0, arg1, arg2);
    =================================================================
    can anyone give me the source code for this BinaryBlobType.java according to mysql blob handling ..

    Moderator action: crosspost deleted.

  • JDBC/OCI8 Array inserts

    Does JDBC/OCI8 support array inserts? I'm familiar with the C/C++ array inserts, but I haven't found anything on array inserting using JDBC/OCI8.
    Array processing gives an application a real performance boost and I was hoping to use it in Java.

    Hi ,
    I am facing the same problem with
    Oracle 8.1.5 on Windows NT.
    Driver : 8.1.6 JDBC OCI Driver
    JDK 1.2.2
    Any workaround / patch to solve this problem please ?
    Thanks,
    Shubhada

  • Array Insert/Update/Select in JDBC

    I've been using array processing in ODBC, OCI, and Pro*C for years and desperately need to do so in JDBC. I've thus far been unsuccessful and am beginning to doubt that it's supported which to me is unfathomable. I've likewise found many like inquiries on the net - none of which were addressed. There have been many respondants who don't undertstand what array processing is and mistake it for batch SQL statements. They are not the same. Batched SQL statements are seperate statements which are executed in a single call to the database engine. What I'm taking about is using a prepared statement and binding primitive arrays to the statement. A single statement is executed and the contents of the arrays passed to the database. I've conducted tests years ago and array insert/update is many times faster than batch statements. Does anyone know whether or not JDBC supports array processing? If anyone's interested, I can provide snippets via email which illustrate how this is done in ODBC and other API's.
    Thanks.

    You referred me to
    http://java.sun.com/products/jdbc/download.html. The
    only reference I found to arrays were SQL Arrays - not
    what I'm talking about. See prior C/ODBC snippet. Do
    you know how to do this in JDBC?You are talking about passing an array as a single parameter to and from the underlying database correct? (And that has nothing to do with batch processing.)
    If so in section 16.4 "Array Object"..... looking at that section gives the following reference....
    The Array object returned to an application by the ResultSet.getArray and
    CallableStatement.getArray methods is a logical pointer to the SQL ARRAY
    value in the database; it does not contain the contents of the SQL ARRAY value.
    The above has nothing to do with batch processing (although presumably one could use it in a batch process but then one can use String as well.)
    Of course perhaps there is something in there that says that only applies to batch processing. If so could you please point out the section and quote the text.

  • Problems with java and SQL

    Hi all. Not sure if I should ask this here or in an SQL forum. I�m trying to manipulate an access database through java via the JDBC-ODBC bridge driver. The program compiles ok but when I try to execute it I get an error. According to the error there is a syntax problem in my SQL create table statement but it doesn�t tell what the problem is and I�ve looked over the create statement and can�t find anything wrong with it. There is, however, an error code from the driver but I have no way of referencing it. Anyone here know why otherwise normal SQL code would cause a syntax error with java or how I can track the error to get a hint at what�s going wrong? Here is the code and the error:
    // java program to create an access database through JDBC
    import java.sql.*;
    public class videodb {
    public static void main(String args[]) {
         // attempt tp load DB driver
         try {
         // load the jdbc-odbc driver
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         catch (ClassNotFoundException cnfe) // driver not found
         System.err.println("Unable to load database driver");
         System.err.println("Details : " + cnfe);
         System.exit(0);
         try {
         // Create a connection to the data source
              Connection con = DriverManager.getConnection ("jdbc:odbc:vdds","","");
              // Create a statement to execute SQL commands     
              Statement stmt = con.createStatement();
              // create a table for DVD's
              stmt.executeUpdate ("create table DVD (id number(5), name char(30));");
              // insert a record into the DVD table
              //stmt.executeUpdate ("insert into DVD values (0001, 'StarGate');");
              // Close the connection
         con.close();
         catch (SQLException sqle) {
    System.out.println("Problem with SQL: " + sqle);
    System.out.println("Driver Error Number" + sqle.getErrorCode());     
    Error:
    Problem with SQL: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error in CREATE TABLE statement.
    Driver Error Number-3551

    Here's what I got. I don't see anything that helps but I'm kinda new to using SQL and java together.
    D:\javatemp\viddb>java videodb
    Problem with SQL java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver
    ] Syntax error in CREATE TABLE statement.
    Driver Error Number-3551
    java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error in
    CREATE TABLE statement.
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(Unknown Source)
    at videodb.main(videodb.java:31)
    D:\javatemp\viddb>

  • Create Word document with Java

    I want to create a Word Document with Java. But I don't know how can I insert text in a Word document.

    I searched and found JXWord (probably limited to Windows): http://www.geocities.com/picmapicma/
    I'm interrested to know if it works fine...:)

  • String Array declaration with multiple lines

    I have an array declaration with several indexes where it covers multiple lines.
    Please advise if this is the best way to declare an array declaration with multiple lines:
    String cityString = "San Diego, Oakland, London, New York, Dublin," +
    "Dallas, Milan";
    String city[] = cityString.split(",");

    String[] city = {"San Diego", "Oakland", "London",
    "New York", "Dublin", "Dallas", "Toronto"};You can use indentation and line breaks as you like, as usual in Java.

  • Should I do this with Java Code or Stored Procs ? (for best performance)

    Hi All,
    I need to decide where should I implement my business logic, in Java code or Stored procs.
    Here is the requirement :
    - One Order has 70 products (Order_Table )
    - Can be duplicate products, so I have to do summarize / grouping by product
    - For every product, I have to check, if it is entitled for a Bonus product, then I have to Insert one to Bonus_Table.
    - This is done when/after the transaction is SAVED (COMMIT)
    The question is, which one has better PERFORMANCE :
    (1) Create a rowsetIterator on the Order details (70 products) and call a stored procedure to do the logic for every single product (so that the Insert to Bonus_Table done in stored proc). means the stored proc will be called 70 times.
    OR
    (2) After the transaction is COMMITted, call the stored procs ONCE to do the logic for all the products at once.
    OR
    (3) I do all the logic with Java Code within ADF
    Given the requirement above, which approach is most efficient / best performance ?
    Thank you very much,
    xtanto

    Problem with this is that you ask 100 people and you probably get 100 different answers. ;o)
    Many would say that you push as much business logic into the database with your data; others might say you only put data in your database and your business logic is kept on the application server.
    In reality your would probably have a mix of both and your decision would probably be influenced by your own background ...
    Can't be more precise than that.
    Grant

  • ABAP/4 Open SQL array insert results in duplicate databaserecordsfor pk13

    Hi Experts, when I am working with pk13n tranaction iam getting an error message stating that update was terminated by user. when i am checking with st22 it gives the following message. please give the solution , iam sending the code as well.
    An exception occurred that is explained in detail below.
    The exception, which is assigned to class 'CX_SY_OPEN_SQL_DB', was not caught
    in
    procedure "SAVE_DATA" "(FORM)", nor was it propagated by a RAISING clause.
    Since the caller of the procedure could not have anticipated that the
    exception would occur, the current program is terminated.
    The reason for the exception is:
    If you use an ABAP/4 Open SQL array insert to insert a record in
    the database and that record already exists with the same key,
    this results in a termination.
    (With an ABAP/4 Open SQL single record insert in the same error
    situation, processing does not terminate, but SY-SUBRC is set to 4.) please find the below code please give the solution for this error message.
    1 *eject
    2 *----
    3 *   Verbuchen der Daten                                           *
    4 *----
    5 FORM SAVE_DATA.
    6
    7   DATA: lf_menge LIKE ekpo-menge VALUE 0,                   "717464
    8         lf_netwr LIKE ekpo-netwr VALUE 0.
    9
    10 * Einteilungen löschen --> Array Delete aus Tabelle DEKET
    11   DESCRIBE TABLE DEKET LINES SY-TFILL.
    12   IF SY-TFILL GT 0.
    13     DELETE EKET FROM TABLE DEKET.
    14     IF SY-SUBRC NE 0.
    15       MESSAGE A865.
    16     ENDIF.
    17     EKET_DELETE = EKET_DELETE + SY-DBCNT.
    18     REFRESH: DEKET.
    19     CLEAR  : DEKET.
    20   ENDIF.
    21
    22 * Einteilungen hinzufügen --> Array Insert aus Tabelle IEKET
    23   DESCRIBE TABLE IEKET LINES SY-TFILL.
    24   IF SY-TFILL GT 0.
    >>     INSERT EKET FROM TABLE IEKET.
    26     IF SY-SUBRC NE 0.
    27       MESSAGE A864.
    28     ENDIF.
    29     EKET_INSERT = EKET_INSERT + SY-DBCNT.
    30     REFRESH: IEKET.
    31     CLEAR  : IEKET.
    32   ENDIF.
    33
    34 * Check whether the qty in EKPO-MENGE is correct: note 717464
    35   SELECT SUM( menge ) FROM eket INTO lf_menge
    36                       WHERE ebeln = ekpo-ebeln
    37                       AND   ebelp = ekpo-ebelp.
    38   IF sy-subrc = 0 AND ekpo-menge <> lf_menge.
    39     IF ekpo-ktmng <> 0.
    40       refe1 = ekpo-zwert * lf_menge / ekpo-ktmng.
    41     ELSE.
    42       refe1 = ekpo-zwert * lf_menge / 1000.
    43     ENDIF.
    44     IF refe1 > maxwert.

    Hi,
    Well I don't know why you have duplicates, this is a functionnal issue. But you get the dump due the the message number 864 that triggers the abend... Changing the message type to 'E', 'S' or 'I' will prevent the dump but I guess this message has a good reason to be
    Kr,
    Manu.

  • How to create a ms-access table with java?

    hi all
    i've my application and i want to add the capability to creat an access file (.mdb) and then, via SQL , create a table, with many columns of many types, and with a primary key too.
    i know that it's also an SQL problem, but i'm searching for it everywhere
    thanx for your reply
    sandro

    Hi,
    It would have been much better if you had specified your development environment- the database driver class depends on which environment you are working with. Forexample, if you are working with vj++6 you can make use of the com.ms.jdbc.odbc.JdbcOdbcDriver class. If you are using IBM's Visual Age for Java3.5 you can find the sun.jdbc.odbc.JdbcOdbcDriver. Oneway or another you should have the .class for jdbc-odbc(usu they have the form: xxx:jdbc:odbc:JdbcOdbcDriver). Check all the packages that are available in your development environment that have the form xxx.jdbc.odbc.JdbcOdbcDriver.(And not clear what you know and what you don't - so I start from the very elementary steps)
    Anyways, What you have to know is that it is not possible to create databases (e.g. .mdb) directly from a Java application(as far as I know). What is possible is to create new tables inside an already created database and process queries based on those tables.In short what I am saying is : you need to have a DSN before writing applications that create tables.
    Follow the following steps to create DSN(for win2000):
    1)Go to the control panel and click the 'administrative tools'
    2)In the 'administrative tools' click to open ODBC(data sources)
    3)Click the 'add' button and choose 'Microsoft Access driver'
    4)In the DSN text field enter the dsn (e.g., Test)
    5)If you want to create a table in an already existing database choose select and select one. However, if you want to create a new database click 'create' and enter a name for your database(e.g. ExampleDB.mdb). If you do this successfully it will issue a successfull operation message.
    6)Click advanced and enter the login name(e.g. Albert) and password(e.g. mxvdk) for the database
    7)Click 'ok's to finish the operation.
    After the above three operations what you will have is an empty database(with no tables) named "ExampleDB.mdb" in the directory you specified.
    Now, you can write a java application that creates a table inside the database "ExampleDB.mdb".
    Check this out:
    import java.sql.*;
    public class Class1{
    public Class1(){
    String userName = "Albert";
    String password = "mxvdk";
    String dsn = "Test";
    String databaseURL = "jdbc:odbc:"+dsn;
    //This is just an sql table creating statement- have nothing to do with java
    String sqlCreateStmt = "CREATE TABLE StudentTable" +
    "(StudentID varchar(32) PRIMARY KEY," +
    "name varchar(30)," +
    "age int)";
         try{
         Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver");
         }catch(ClassNotFoundException eCNF){
              System.err.println("ClassNotFoundException:");
              System.err.println(eCNF.getMessage());
         try{
         con = DriverManager.getConnection(databaseURL,userName,password);
         stmt = con.createStatement();
         stmt.executeUpdate(sqlCreateStmt);
         }catch(SQLException e){
    System.err.println("SQLException:");
    e.printStackTrace();
         //insert one sample data
    insertSampleData();
    private void insertSampleData(){
         String sampleStudentID = "scr-342-tch";
         String sampleStudentName = "Tom James";
         int sampleStudentAge = 24;
    //This is just an sql table updating statement- have nothing to do with java
         String sqlUpdateStmt = "INSERT INTO StudentTable VALUES ('"+
                             sampleStudentID+"','"+
                             sampleStudentName+"',"+
                             sampleStudentAge+")";
         try{
              stmt.executeUpdate(sqlUpdateStmt);
              }catch(SQLException e){
              System.err.println("SQLException:");
              e.printStackTrace();
    public static void main(String[] args){
    new Class1();
    private Connection con;
    private Statement stmt;
    //This program runs perfectly in my VJ++6.0 (console application mode) and also in my IBM's
    //visual Age for Java3.5 (with sun.jdbc.odbc.JdbcOdbcDriver as my database driver)
    //If you are developing in another development environment, what you need to change is the
    //"com.ms.jdbc.odbc.JdbcOdbcDriver" in Class.forName("com...") stmt.
    //If you run this program more than once, it will issue 'tableAlreadyExists' message
    If you still experience the problem, pls be specific and repost!

  • The size limit of the OCI LOB Array Insert is 64K for one field?

    I have a table with 4 field, and one is BLOB field. I want to insert 16 rows in one OCIStmtExecute. I know I can specify the iter parameter with 16 to execute sql 16 times.
    I found example in "Application Developer's Guide - Large Objects" in page "Data Interface for Persistent LOBs 13-17", there is a example function called "array_insert". It shows the usage of OCIBindArrayOfStruct, but can only insert LOB with same size, the LOB field of each row filled with the same size data.
    But I have to insert LOB with different size, for example 8K for row 1, and 16K for row 2, 128K for row 3. Than I find the alenp parameter of OCIBindByName/OCIBindByPos. It is "pointer to array of actual lengths of array elements."(OCI document). So I think I find the solution for my problem. But the type of alenp parameter is ub2*, is it means I can only insert 64K data for each row in my array insert? It is too small, I hope I can array insert BLOB with 16M each row.
    Or there is any other solution for my problem? I look forward to it for a long time! thanks every one!

    It is called Data Interface to work with LOB datatypes by APIs designed for use with legacy datatypes. I can specify SQLT_BIN to bind memory binary data to BLOB column, and INSERT or UPDATE directly. It can be without LOB locator and save round-trip to the server. This is very fit my needs, because I have to insert very much BLOBs to server as soon as possible.
    I have make a test program, and multi-row with different size blob( less than 65536 bytes) can be insert at one time, without locators. Multi-row wiht same size blob( more than 64K) also can be insert at one time--the alenp parameter is not used. I only can not insert multi-row with different size blob( more than 64k) because the type of alenp is ub2*.
    thank you for your reply!

  • Problems with java logging utility

    Hi,
    I am having a few problems with java's logging framework.
    When I create a logger using
    Logger log = Logger.getLogger("my.com");
    and log my messages using this "log" object, the messages are logged to System.err which is my console. But when I add a Filehandler to this Logger object, I get log messages both in the file and the standard error.
    The problem is that I want to supress logging to the standard error but do not know how to do this. I tried a few things:
    1) If I close the standard error (System.err.close() ), things work fine but I can't afford doing this since other parts of my application might use System.err for some purpose.
    2) I thought that , by default, a ConsoleHandler object is added to the Logger object. So I thought I might get around the problem if I close() this ConsoleHandler object. But, to my surprise, log.getHandlers() returns an empty array by default. So there is no ConsoleHandler attached to it.
    Any info. regarding it will be very much appreciated.
    Thanks,
    Arch.

    Logger.setUseParentHandlers(false)

  • My CLOB insert with PreparedStatements WORKS but is SLOOOOWWW

    Hi All,
    I am working on an application which copies over a MySQL database
    to an Oracle database.
    I got the code to work including connection pooling, threads and
    PreparedStatements. For tables with CLOBs in them, I go through the
    extra process of inserting the CLOBs according to Oracle norm, i.e.
    getting locator and then writing to that:
    http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/LOBSample.java.html (Good Example for BLOBs, CLOBs)
    However, for tables with such CLOBs, I only get a Record per second insert
    of about 1/sec!!! Tables without CLOBs (and thus, without the round-about-way)
    of inserting CLOBs are approx. 10/sec!!
    How can I improve the speed of my clob inserts / improve the code? At the moment, for
    a table of 30,000 records (with CLOBs) it takes about 30,000 which is 8 hours!!!!
    Here is my working code, which is run when my application notices that the table has
    CLOBs. The record has already been inserted with all non-clob fields and the "EMPTY_BLOB()"
    blank for the CLOB. The code then selects that row (the one just inserted), gets a handle on the
    EMPTY_BLOB location and writes the my CLOB content (over 4000 characters) to that handles
    and then closes the handle. At the very end, I do conn.commit().
    Any tips for improving speed?
    conn.setAutoCommit(false);
    * This first section is Pseudo-Code. The actual code is pretty straight
    * forward. (1) I create the preparedStatement, (2) I go record by record
    * - for each record, I (a) loop through each column and run the corresponding
    * setXXX to set the preparedStatement parameters, (b) run
    * preparedStatement.executeUpdate(), and (c) if CLOB is present, run below
    * actual code.
    * During insertion of the record (executeUpdate), if I notice that
    * a Clob needs to be inserted, I insert a "EMPTY_CLOB()" placeholder and set
    * the flag "clobInTheHouse" to true. Once the record is inserted, if "clobInTheHouse"
    * is actually "true," I go to the below code to insert the Blob into that
    * newly created record's "EMPTY_CLOB()" placeholder
    // clobSelect = "SELECT * FROM tableName WHERE "uniqueRecord" LIKE '1'
    // I create the above for each record I insert and have this special uniqueRecord value to
    // identify what record that is so I can get it below. clobInTheHouse is true when, where I
    // insert the records, I find that there is a CLOB that needs to be inserted.
    if(clobInTheHouse){
         ResultSet lobDetails = stmt.executeQuery(clobSelect);
         ResultSetMetaData rsmd = lobDetails.getMetaData();
         if(lobDetails.next()){
              for(int i = 1; i <= rsmd.getColumnCount(); i++){
                 // if column name matches clob name, then go and do the rest
                   if(clobs.contains(rsmd.getColumnName(i))){
                        Clob theClob = lobDetails.getClob(i);
                        Writer clobWriter = ((oracle.sql.CLOB)theClob).getCharacterOutputStream();
                        StringReader clobReader = new StringReader((String) clobHash.get(rsmd.getColumnName(i)));
                        char[] cbuffer = new char[30* 1024]; // Buffer to hold chunks of data to be written to Clob, the slob
                        int nread = 0;
                        try{
                             while((nread=clobReader.read(cbuffer)) != -1){
                                  clobWriter.write(cbuffer,0,nread);
                        }catch(IOException ioe){
                           System.out.println("E: clobWriter exception - " + ioe.toString());
                        }finally{
                             try{
                                  clobReader.close();
                                  clobWriter.close();
                                  //System.out.println("   Clob-slob entered for " + tableName);
                             }catch(IOException ioe2){
                                  System.out.println("E: clobWriter close exception - " + ioe2.toString());
         try{
              stmt.close();
         }catch(SQLException sqle2){
    conn.commit();

    Can you use insert .. returning .. so you do not have to select the empty_clob back out.
    [I have a similar problem but I do not know the primary key to select on, I am really looking for an atomic insert and fill clob mechanism, somone said you can create a clob fill it and use that in the insert, but I have not seen an example yet.]

  • How to use SQl server 2005's SQLXMLBulkLoad with JAVA

    Hi All,
    I am in a big problem identifying how to use xml bulk insert functionality of sql server 2005 with java.
    I need to enter millions of data into the sql server 2005 database.
    All the material i saw on net includes vb script or asp.net sripts to do so.
    Somebody please tell how I can do this with JAVA.
    Thanks.

    In this forum we commonly discuss connections from Oracle to foreign databases. When you want to connect with your SQL Server to Oracle it would be better to ask that in a Microsoft forum as they support their LINKED SERVER mechanism.
    The linked server set up is for example described in the Microsoft knowledge base as:
    280106 - HOW TO: Set Up and Troubleshoot a Linked Server to Oracle in SQL Server
    In newer SQl Server releases the name changed see for example:
    How to run a SQL Server 2005 Integration Services package as a SQL Server Agent job step
    View products that this article applies to.
    Article ID : 912911
    As you can see they are commonly using OLEDB driver. So you might have to install Oracle's OLEDB driver as well. Else you might think about using OLEDB to ODBC bridge

Maybe you are looking for

  • Problem with text direction in table component for text with two language!

    Hi, I want to display text in table component by binding to the one property,and also the language of this text is farsi that must be in the RTL direction. so i defined a direction in style of staticText component in the table. when the text is only

  • Daughter's MacBook Pro Hard Drive Full

    My daughter's MacBook Pro running Snow Leopard 250GB hard drive is full. I emptied the trash which made 7 GB available. I bought a 1TB external to move files to. I cannot get anything to move. Cannot drag. Cannot copy and paste. Need help quick pleas

  • Pages Text Box Question

    Can I create a text box in Pages that can automatically scale vertically to fit the text inside? I'm trying to create a modular element for a template that someone can paste any amount of text into without having to manually change the vertical scale

  • My on line connection goes in and out on this computer only

    I think there is something wrong with my computer.  We have another in the house which is working fine, but on this computer, the internet connection keeps failing and then coming back and then failing.....anything I can do without having to take it

  • Sort in OBIEE Answers - Desc Nulls Last

    I want to sort Desc on a Answers column, but want NULLS last. Where do I set it? For instance I can write SQL select * from T1 order by c2 Nulls first; NULLS last is default behavior in Oracle SQL However, via OBIEE Answers, I see when I use DESC Nul