Bug in Oracle UpdatableResultSet? (insert, updateString requires non-empty ResultSet?

As far as I can determine from the documentation and posts in other newsgroups
the following example should work to produce an updatable but "empty" ResultSet which can be used to insert rows.
But it doesn't work in a JDK 1.2.2 and JDK 1.3.0_01 application using Oracle 8i (8.1.7) thin JDBC
driver against an Oracle 8.1.5 database I get the following error
SQLException: java.sql.SQLException: Invalid argument(s) in call: setRowBufferAt
However, if I change it to so the target (ie insert) ResultSet is initialized to contain one or more
rows, it works just fine.
ResultSet rset2 = stmt2.executeQuery ( "select Context.* from Context where ContextCd = '0' " );
Is this a bug in Oracle's JDBC driver (more specifically, the UpdatableResultSet implimentation)?
Does an updatabable ResultSet have to return rows to be valid and useable for insert operations?
If it does, is there another way to create an updatable ResultSet that does not depend upon
"hard-coding" some known data value into the query?
try
// conn is a working, tested connection to an Oracle database via 8.1.7 thin JDBC driver.
// source statement
Statement stmt = conn.createStatement (
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
System.out.println("source rset");
rset = stmt.executeQuery ( "select Context.* from Context" );
// target Statement
Statement stmt2 = conn.createStatement (
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE );
ResultSet rset2 =
stmt2.executeQuery ( "select Context.* from Context where ContextCd = NULL" );
System.out.println(
"see if rset2 looks good even though empty (bcs primarykey = null)");
ResultSetMetaData rsmd2 = rset2.getMetaData();
int numColumns = rsmd2.getColumnCount();
for( int i = 0; i <= numColumns; i++ )
env.msg.println ( "(" + i + ") " + rsmd2.getColumnLabel(i) );
// test results showed the correct columns even though no row returned.
// quess we can use this trick to create an "empty" insert ResultSet.
System.out.println("interate through rset and insert using rset2");
if(rset.next())
System.out.println("move to insert row");
rset2.moveToInsertRow();
System.out.println("insert values");
rset2.updateString( "ContextCd", rset.getString("ContextCd") + "-test" );
rset2.updateString( "Descrip", "test" );
rset2.updateString( "Notes", "test" );
System.out.println("insert row into db (but not committed)");
rset2.insertRow();
catch( ... ) ...
Thanks
R.Parr
Temporal Arts

I have noticed the same problem, actually it doens't matter if there is no data in your resultset. If you have a result with data and suppose you were to analyze the data by moving through all of the rows, the cursor is now after the last row. If you call insertRow, the same exception is thrown. Kinda strange, I didn't get any response as to why this is happening and that was a few weeks ago. I hope someone responds, at this point I am just re-writing some of my code to not use updateable resultsets.
<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by Randall Parr ([email protected]):
As far as I can determine from the documentation and posts in other newsgroups
the following example should work to produce an updatable but "empty" ResultSet which can be used to insert rows.
But it doesn't work in a JDK 1.2.2 and JDK 1.3.0_01 application using Oracle 8i (8.1.7) thin JDBC
driver against an Oracle 8.1.5 database I get the following error<HR></BLOCKQUOTE>
null

Similar Messages

  • Inserting error: 100500: non-ORACLE exception

    Hi,
    I have bunch of inserts in post_update trigger in Forms. When I commit the changes , i notice the error message inserting error: 100500: non-ORACLE exception. I have 6 inserts and only one insert is fired. Please help. I am using forms 6.0.8
    Thanks,

    Hi,
    Thanks for the help. I had 6 inserts in one stored proc hence the problem. I split it into 3 different procs and it works now.Thanks Again.
    I didn't have any call to next-record etc...

  • Bug in Oracle JDBC thin driver (parameter order)

    [ I'd preferably send this to some Oracle support email but I
    can't find any on both www.oracle.com and www.technet.com. ]
    The following program illustrates bug I found in JDBC Oracle thin
    driver.
    * Synopsis:
    The parameters of prepared statement (I tested SELECT's and
    UPDATE's) are bound in the reverse order.
    If one do:
    PreparedStatement p = connection.prepareStatement(
    "SELECT field FROM table WHERE first = ? and second = ?");
    and then bind parameter 1 to "a" and parameter to "b":
    p.setString(1, "a");
    p.setString(2, "b");
    then executing p yields the same results as executing
    SELECT field FROM table WHERE first = "b" and second = "a"
    although it should be equivalent to
    SELECT field FROM table WHERE first = "a" and second = "b"
    The bug is present only in "thin" Oracle JDBC driver. Changing
    driver to "oci8" solves the problem.
    * Version and platform info:
    I detected the bug using Oracle 8.0.5 server for Linux.
    According to $ORACLE_HOME/jdbc/README.doc that is
    Oracle JDBC Drivers release 8.0.5.0.0 (Production Release)
    * The program below:
    The program below illustrates the bug by creating dummy two
    column table, inserting the row into it and then selecting
    the contents using prepared statement. Those operations
    are performed on both good (oci8) and bad (thin) connections,
    the results can be compared.
    You may need to change SID, listener port and account data
    in getConnecton calls.
    Sample program output:
    $ javac ShowBug.java; java ShowBug
    Output for both connections should be the same
    --------------- thin Driver ---------------
    [ Non parametrized query: ]
    aaa
    [ The same - parametrized (should give one row): ]
    [ The same - with buggy reversed order (should give no answers):
    aaa
    --------------- oci8 driver ---------------
    [ Non parametrized query: ]
    aaa
    [ The same - parametrized (should give one row): ]
    aaa
    [ The same - with buggy reversed order (should give no answers):
    --------------- The end ---------------
    * The program itself
    import java.sql.*;
    class ShowBug
    public static void main (String args [])
    throws SQLException
    // Load the Oracle JDBC driver
    DriverManager.registerDriver(new
    oracle.jdbc.driver.OracleDriver());
    System.out.println("Output for both connections should be the
    same");
    Connection buggyConnection
    = DriverManager.getConnection
    ("jdbc:oracle:thin:@localhost:1521:ORACLE",
    "scott", "tiger");
    process("thin Driver", buggyConnection);
    Connection goodConnection
    = DriverManager.getConnection ("jdbc:oracle:oci8:",
    "scott", "tiger");
    process("oci8 driver", goodConnection);
    System.out.println("--------------- The end ---------------");
    public static void process(String title, Connection conn)
    throws SQLException
    System.out.println("--------------- " + title + "
    Statement stmt = conn.createStatement ();
    stmt.execute(
    "CREATE TABLE bug (id VARCHAR(10), val VARCHAR(10))");
    stmt.executeUpdate(
    "INSERT INTO bug VALUES('aaa', 'bbb')");
    System.out.println("[ Non parametrized query: ]");
    ResultSet rset = stmt.executeQuery(
    "select id from bug where id = 'aaa' and val = 'bbb'");
    while (rset.next ())
    System.out.println (rset.getString (1));
    System.out.println("[ The same - parametrized (should give one
    row): ]");
    PreparedStatement prep = conn.prepareStatement(
    "select id from bug where id = ? and val = ?");
    prep.setString(1, "aaa");
    prep.setString(2, "bbb");
    rset = prep.executeQuery();
    while (rset.next ())
    System.out.println (rset.getString (1));
    System.out.println("[ The same - with buggy reversed order
    (should give no answers): ]");
    prep = conn.prepareStatement(
    "select id from bug where id = ? and val = ?");
    prep.setString(1, "bbb");
    prep.setString(2, "aaa");
    rset = prep.executeQuery();
    while (rset.next ())
    System.out.println (rset.getString (1));
    stmt.execute("DROP TABLE bug");
    null

    Horea
    In the ejb-jar.xml, in the method a cursor is closed, set <trans-attribute>
    to "Never".
    <assembly-descriptor>
    <container-transaction>
    <method>
    <ejb-name></ejb-name>
    <method-name></method-name>
    </method>
    <trans-attribute>Never</trans-attribute>
    </container-transaction>
    </assembly-descriptor>
    Deepak
    Horea Raducan wrote:
    Is there a known bug in Oracle JDBC thin driver version 8.1.6 that would
    prevent it from closing the open cursors ?
    Thank you,
    Horea

  • Bug in Oracle 10.2.0.1.0-10.2.0.3.0: Sorted Hash Cluster

    I found another bug in Oracle:
    SQL> create cluster tfsys_cluster
    2 (
    3 name varchar2(30),
    4 cdp number(6),
    5 stime number(6) sort)
    6 hashkeys 1000
    7 size 100;
    SQL> create table tfsys(
    2 name varchar2(30) not null,
    3 cdp number(6) not null,
    4 stime number(6) not null,
    5 data number(10,2))
    6 cluster tfsys_cluster(name, cdp, stime);
    SQL> alter table tfsys add constraint tfsys_pk primary key(name, cdp, stime);
    SQL> begin
    2 for i in 1..5 loop
    3 insert into tfsys values('IANC', 1, i, 15.25 + i);
    4 end loop;
    5 end;
    6 /
    SQL> commit;
    SQL> select * from tfsys where name='IANC' and cdp=1 and stime <= 3;
    NAME CDP STIME DATA
    IANC 1 1 16,25
    IANC 1 2 17,25
    IANC 1 3 18,25
    SQL> select * from tfsys where name='IANC' and cdp=1 and stime < 3;
    NAME CDP STIME DATA
    IANC 1 1 16,25
    IANC 1 2 17,25
    IANC 1 3 18,25
    SQL> select * from tfsys where name='IANC' and cdp=1 and trunc(stime) < 3;
    NAME CDP STIME DATA
    IANC 1 1 16,25
    IANC 1 2 17,25
    This bug exists in Oracle 10.2.0.1.0-10.2.0.3.0 for Windows installation, for example in Oracle 10.1.0.3.1 for Red Hat 3 this query work right.

    FWIW I have not been able to reproduce your problem on Windows.
    I am getting the same results in Windows and Linux.
    You should check if the execution plan is different in both cases

  • Bug in Oracle's handling of transaction isolation levels?

    Hello,
    I think there is a bug in Oracle 9i database related to serializable transaction isolation level.
    Here is the information about the server:
    Operating System:     Microsoft Windows 2000 Server Version 5.0.2195 Service Pack 2 Build 2195
    System type:          Single CPU x86 Family 6 Model 8 Stepping 10 GenuineIntel ~866 MHz
    BIOS-Version:          Award Medallion BIOS v6.0
    Locale:               German
    Here is my information about the client computer:
    Operaing system:     Microsoft Windows XP
    System type:          IBM ThinkPad
    Language for DB access: Java
    Database information:
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - Production
    The database has been set up using the default settings and nothing has been changed.
    To reproduce the bug, follow these steps:
    1. Create a user in 9i database called 'kaon' with password 'kaon'
    2. Using SQL Worksheet create the following table:
    CREATE TABLE OIModel (
    modelID int NOT NULL,
    logicalURI varchar (255) NOT NULL,
    CONSTRAINT pk_OIModel PRIMARY KEY (modelID),
    CONSTRAINT logicalURI_OIModel UNIQUE (logicalURI)
    3. Run the following program:
    package test;
    import java.sql.*;
    public class Test {
    public static void main(String[] args) throws Exception {
    java.util.Locale.setDefault(java.util.Locale.US);
    Class.forName("oracle.jdbc.OracleDriver");
    Connection connection=DriverManager.getConnection("jdbc:oracle:thin:@schlange:1521:ORCL","kaon","kaon");
    DatabaseMetaData dmd=connection.getMetaData();
    System.out.println("Product version:");
    System.out.println(dmd.getDatabaseProductVersion());
    System.out.println();
    connection.setAutoCommit(false);
    connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
    int batches=0;
    int counter=2000;
    for (int outer=0;outer<50;outer++) {
    for (int i=0;i<200;i++) {
    executeUpdate(connection,"INSERT INTO OIModel (modelID,logicalURI) VALUES ("+counter+",'start"+counter+"')");
    executeUpdate(connection,"UPDATE OIModel SET logicalURI='next"+counter+"' WHERE modelID="+counter);
    counter++;
    connection.commit();
    System.out.println("Batch "+batches+" done");
    batches++;
    protected static void executeUpdate(Connection conn,String sql) throws Exception {
    Statement s=conn.createStatement();
    try {
    int result=s.executeUpdate(sql);
    if (result!=1)
    throw new Exception("Should update one row, but updated "+result+" rows, query is "+sql);
    finally {
    s.close();
    The program prints the following output:
    Product version:
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - Production
    Batch 0 done
    Batch 1 done
    java.lang.Exception: Should update one row, but updated 0 rows, query is UPDATE OIModel SET logicalURI='next2571' WHERE modelID=2571
         at test.Test.executeUpdate(Test.java:35)
         at test.Test.main(Test.java:22)
    That is, after several iterations, the executeUpdate() method returns 0, rather than 1. This is clearly an error.
    4. Leave the database as is. Replace the line
    int counter=2000;
    with line
    int counter=4000;
    and restart the program. The following output is generated:
    Product version:
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - Production
    Batch 0 done
    Batch 1 done
    java.sql.SQLException: ORA-08177: can't serialize access for this transaction
         at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
         at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
         at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
         at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
         at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
         at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
         at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
         at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)
         at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:796)
         at test.Test.executeUpdate(Test.java:33)
         at test.Test.main(Test.java:22)
    This is clearly an error - only one transaction is being active at the time, so there is no need for serialization of transactions.
    5. You can restart the program as many times you wish (by chaging the initial counter value first). The same error (can't serialize access for this transaction) will be generated.
    6. The error doesn't occur if the transaction isolation level isn't changed.
    7. The error doesn't occur if the UPDATE statement is commented out.
    Sincerely yours
         Boris Motik

    I have a similar problem
    I'm using Oracle and serializable isolation level.
    Transaction inserts 4000 objects and then updates about 1000 of these objects.
    Transactions sees inserted objects but cant update them (row not found or can't serialize access for this transaction are thrown).
    On 3 tries for this transaction 1 succeds and 2 fails with one of above errors.
    No other transactions run concurently.
    In read commited isolation error doesn't arise.
    I'm using plain JDBC.
    Similar or even much bigger serializable transaction works perfectly on the same database as plsql procedure.
    I've tried oci and thin (Oracle) drivers and oranxo demo (i-net) driver.
    And this problems arises on all of this drivers.
    This problem confused me so much :(.
    Maby one of Oracle users, developers nows cause of this strange behaviour.
    Thanx for all answers.

  • Bug in Oracle 9.2.0.1.0.

    I have found a bug in Oracle 9.2.0.1.0.
    Here is the bug analysis.
    Step 1:
    CREATE TABLE T1 ( ENO NUMBER, ENAME VARCHAR2(100));
    Step 2:
    CREATE TABLE T2 (DNAME VARCHAR2(1000));
    Step 3:
    INSERT INTO T1 VALUES (1,’KARTHIK’);
    Step 4:
    INSERINTO T2 VALUES ('VENKATRAMAN');
    Commit;
    Now try executing this command,
    Command:
    SELECT * FROM T1 WHERE ENO IN (SELECT ENO FROM T2);
    Here table T2 does not contain “ENO”.
    But the query returns,
    Output:
    =====
    ENAME
    DNAME
    1
    KARTHIK
    VENKATRAMAN
    “ENO” column is being fetched from the main query with table T1 and not from the sub query with table T1.
    Please verify this bug and kindly provide a response.
    Regards,
    Karthik

    Well, heres my test (10g, for I dont have a 9.2.0.1.0, but I think it´d show the same result):
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    SQL> select *
      2  from t1;
    ENO ENAME
       1 KARTHIK
    SQL> select *
      2  from t2;
    DNAME
    VENKATRAMAN
    SQL> select *
      2  from t1
      3  where eno in (select eno from t2);
    ENO ENAME
       1 KARTHIK
    SQL> alter table t2 add (eno number);
    Table altered.
    SQL> select *
      2  from t1
      3  where eno in (select eno from t2);
    no rows selected
    SQL> alter table t2 drop (eno);
    Table altered.
    SQL> select *
      2  from t1
      3  where eno in (select t2. eno from t2);
    where eno in (select t2. eno from t2)
    ERROR at line 3:
    ORA-00904: "T2"."ENO": invalid identifier
    SQL>
    But he is getting output of table T2 too se his last postI don´t think so, because he didn´t SELECT it. Would be nice to just copy & paste the output...
    Regards,
    Gerd

  • Bug in Oracle JDBC Drivers with {ts ?}

    Oracle fails to set bind variables correctly when using the {ts ?} in an insert. It works ok if you use {d ?}.
    Ex:
    String st = "INSERT INTO BL(NM,TSTAMP) VALUES (?,{ts ?} )";
    System.out.println(dbConn.nativeSQL(st));
    java.sql.PreparedStatement stmt = dbConnn.prepareStatement(st);
    stmt.setString(1,"test");
    stmt.setString(2,"2000-08-18 09:33:45");
    int xx = stmt.executeUpdate();
    Oracle Reports:
    INSERT INTO BL (NM,TSTAMP) VALUES (:1,TO_DATE (?, 'YYYY-MM-DD HH24:MI:SS'))
    ConnectionPoolManager failed:java.sql.SQLException: ORA-00911: invalid character
    Notice the ? doesn't change to :2.
    Whoops.
    Also when does Oracle plan to implement {fn }
    scalars. There are work arounds but they are not portable. If not soon we will switch our suggested database for our clients.
    null

    Horea
    In the ejb-jar.xml, in the method a cursor is closed, set <trans-attribute>
    to "Never".
    <assembly-descriptor>
    <container-transaction>
    <method>
    <ejb-name></ejb-name>
    <method-name></method-name>
    </method>
    <trans-attribute>Never</trans-attribute>
    </container-transaction>
    </assembly-descriptor>
    Deepak
    Horea Raducan wrote:
    Is there a known bug in Oracle JDBC thin driver version 8.1.6 that would
    prevent it from closing the open cursors ?
    Thank you,
    Horea

  • ORACLE LOG ERRORS - Bug in oracle??

    Hi,
    we are using oracle log errors to capture oversized err records for varchar2 type fields. Sql is something like:
    INSERT INTO abc (col1,col2) VALUES ('asdsass','weqwewqee') LOG ERRORS INTO abc_err('1') REJECT LIMIT UNLIMITED;
    But, data captured in abc table is trimmed data. Right spaces present in source are being trimmed by oracle while capturing this error table. I have the following queries:
    -Has anyone else experienced this type of behavior?
    -Is it a bug in oracle log errors functionallity??
    -Is there any workaround to use oracle log errors functionality to catch untrimmed data?
    thanks,
    Edited by: user7036480 on Dec 11, 2008 4:22 PM

    user7036480 wrote:
    -Has anyone else experienced this type of behavior? Yes, described in that issue while "log errors into g_logtest_err(1) reject limit 1" (is it you?)
    -Is it a bug in oracle log errors functionallity?? Raise a SR to know.
    -Is there any workaround to use oracle log errors functionality to catch untrimmed data?No.
    Nicolas.

  • BUGS in Oracle Lite ADOCE

    am doing VB programming on msacess in iPAQ device ,
    there is some limitation in sql and one told me those are not exists in orale lite
    so i tred it , intallation ok , running msql ok , creating odb ok ,
    when it comes to programming with ADOCE it is the disaster ;
    i have table ORDER ( OREDERNO NUMBER(9) , ..... )
    when i use
    set orders = CreateObject(oladoce.recordset)
    orders.Open "ORERS", ,1,3
    orders.AddNew
    orders.Fields("ORDERNO").value = 21
    orders.Update
    the program exits on line 2 , even ON ERROR can't catch the error
    the funny thing it passes for some other numbers e.g.
    orders.Fields("ORDERNO").value = 1
    orders.update
    am i doing something wrong or
    there is bugs in oracle ADOCE

    here is the table ORDERS def.
    Name Null? Type
    ORDERNO N NUMBER(5)
    ORDERTYPE Y NUMBER(5)
    PRINTEDNO Y VARCHAR2(15)
    INVOICENO Y VARCHAR2(15)
    BRANCHNO Y VARCHAR2(8)
    COMPANYNO Y VARCHAR2(8)
    SALESMANNO Y VARCHAR2(15)
    CSMNO Y VARCHAR2(15)
    CUSTOMERNO Y VARCHAR2(15)
    SALESECTORNO Y VARCHAR2(4)
    ORDERDATE Y DATE
    DELIVERYDATE Y DATE
    DELIVERYTIME Y VARCHAR2(20)
    ORDERSTATUS Y NUMBER(5)
    and here is the code
    Set Conn = CreateObject("oladoce.activeconnection")
    Conn.Connect "retail"
    Set Orders = CreateObject("oladoce.recordset")
    Orders.Open "ORDERS", , 1, 3
    Orders.AddNew
    Orders.Fields("AREANO").Value = 17 ' here the program exits
    Orders.Update ' it does not even reatch this ine !!!
    you told me to try insert into statement
    i did the following :
    Set Conn = CreateObject("oladoce.activeconnection")
    Conn.Connect "retail"
    Set Orders = CreateObject("oladoce.recordset")
    sqlStmt = "INSERT INTO ORDERS(ORDERNO) VALUES ( 1 ) "
    Orders.Open sqlStmt, , 1, 3
    Set Orders = Nothing
    Conn.Disconnect
    and it does not insert the record into the database
    THE REALLY FUNNY THING WHEN I RUN
    Set Conn = CreateObject("oladoce.activeconnection")
    Conn.Connect "retail"
    Set Orders = CreateObject("oladoce.recordset")
    sqlStmt = "INSERT INTO ORDERS(ORDERNO) VALUES ( 1 ) "
    Orders.Open sqlStmt, , 1, 3
    Set Orders = Nothing
    Set Orders = CreateObject("oladoce.recordset")
    sqlStmt = "commit "
    Orders.Open sqlStmt, , 1, 3
    Set Orders = Nothing
    Conn.Disconnect
    i got an error message ' TABLE OR VIEW NOT FOUND '
    but when i open the table ORDERS i found that the record inserted !!!!!!!
    and you tell me OraLite is not BUGGY !!!!!!!!!!!!!!!!!!

  • Install Oracle Database 11g in a non-global Zone

    Hi Folks
    If everyone install a Oracle 11g database in a non-global zone, please give me some advice.
    Is there any requirements (Packages) in the global zone?
    Some special about the Installation process?
    Any documents or best practice?
    Best regards
    Martin

    If your using full root non-global zones, then it would be the same as installing it on the global zone. This how we do it at my work, we install the DB on a full root zone, that is the only zone on a global zone or the other zone is a very light load.

  • Trigger on a paritioned table to insert into a non-paritioned table

    Hi,
    I have a partitioned table which will have a high degree of concurrent DMLs (Updates). It has a initrans value set to 16. On this table a trigger is created which will insert into a non-partitioned table on update of highly updateable columns. I am planning to keep the initrans value and freelists value to 16 so that it does not serialize and wait for the block slots.
    Is the above set up performance inefficient? Is partitioning the table in which the trigger inserts will improve the performance?
    Thanks,
    Rajesh

    I think if you want to consider an efficient solution, I would look at not implementing your requirements using triggers. If possible consider an API approach where whatever "applicaiton" is being used calls a PL/SQL package that will update both tables if necessary. There are a number of disadvantages to using triggers.
    HTH!
    Edited by: Centinul on Jan 2, 2009 11:48 PM
    Check out this recent thread on triggers: Should one really avoid triggers???

  • READ ME Before you decide to use IKM Oracle Multi-Insert in ODI 12c

    Ok, I've decided to write this to help out others who may be heading down this twisted mess and hope they can benefit from my pain.
    If using a sequence, do not use this IKM.
    The primary reason is Oracle's INSERT ALL statement is NOT atomic.  This means it WILL eventually give "ORA-02291: integrity constraint (XXX) violated - parent key not found" when it attempts to insert rows into the child table first.  To make it work, the constraint(s) in question must be disabled or set to deferred.  However, if either is done, there is no need to use the INSERT ALL because the multiple inserts can now be done in any order without error as long as everything is kosher at the time the constraint is enabled or set to immediate.  So the very fix for the IKM makes its use unnecessary.
    The second reason is it burns sequence numbers.  The IKM has a tendency of grabbing the filter (no matter how buried) right before it and putting it in the WHEN statement of the INSERT ALL.  This will burn sequence numbers because the rows are not filtered prior to being feed into the insert.  Not an issue for small rowsets, but for large rowsets or frequently run mappings the burn can be quite substantial.  This can be fixed by manipulating hints and/or the physical tab, but may result in poorer performance than just using a different IKM that doesn't burn sequence numbers.
    If you are doing anything else besides the multi-insert in the same mapping, beware!  This IKM does not allow ODI to respect the Target Load Order specified on the mapping.  I've found that it usually puts the multi-insert last in sequence.  It can be fixed by working on the physical tab, and making multiple targets but it also crashed several times when I was using it.  Additionally it resisted doing what seemed like simple tasks (like dragging multiple items at a time or trying to drag items off to the right of the execution units).  As I've said elsewhere, I think this is a bug and it will probably be fixed in the future.
    So my advice is avoid using this IKM at all costs.  Just disable or defer your constraints and use the other IKMs.
    BTW, if you want to defer the constraints, I've found you can set the On Connect command of the Physical topology to:
    ALTER SESSION SET CONSTRAINTS = DEFERRED
    and then select all the transactions in the list.  Trying it in the Begin Mapping Command of the mapping does not appear to work.
    Please let me know if I got anything wrong,
    Scott

    This is not the first instance of KM load strategy that has had the nasty side effect of burning sequence numbers - see the following:
    ODI Oracle Merge Incremental Update burns sequence values - jason's hyperion blog
    However, at least this one does now seem to have been modified to try and address this issue.

  • Bug in Oracle 8.1.6.0.0

    Did any one come accrossed with the bug no 1328999 in oracle 8.1.6.0.0 on solaries. If any one please reply me.
    Actually my problem is i am getting too many deadlocks in my application i am using MTS (Microsoft Transaction server as application server ) and database is 8.1.6.0.0. of oracle in solaries.
    Did any one has similar problems please reply me.
    If so
    How could you confirm that the problem u are getting is because of a bug in oracle 8.1.6.0.0
    Please some one reply me

    Hi kawollek,
    Thanks for the reply.
    But when i tried with the example provided. I am unable to connect to oracle. it gives the error 0ra-03114 not connected to oracle.
    How do i give the host string in oracle or dsn in the programe to connect to the database.
    If u have tried please help me.....
    Thanks & regards
    Rama Raju D.S

  • Bug in Oracle JDBC Pooling Classes - Deadlock

    We are utilizing Oracle's connection caching (drivers 10.2.0.1) and have found a deadlock situation. I reviewed the code for the (drivers 10.2.0.3) and I see the same problem could happen.
    I searched and have not found this problem identified anywhere. Is this something I should post to Oracle in some way (i.e. Metalink?) or is there a better forum to get this resolved?
    We are utilizing an OCI driver with the following setup in the server.xml
    <ResourceParams name="cmf_toolbox">
    <parameter>
    <name>factory</name>
    <value>oracle.jdbc.pool.OracleDataSourceFactory</value>
    </parameter>
    <parameter>
    <name>driverClassName</name>
    <value>oracle.jdbc.driver.OracleDriver</value>
    </parameter>
    <parameter>
    <name>user</name>
    <value>hidden</value>
    </parameter>
    <parameter>
    <name>password</name>
    <value>hidden</value>
    </parameter>
    <parameter>
    <name>url</name>
    <value>jdbc:oracle:oci:@PTB2</value>
    </parameter>
    <parameter>
    <name>connectionCachingEnabled</name>
    <value>true</value>
    </parameter>
    <parameter>
    <name>connectionCacheProperties</name>
    <value>(InitialLimit=5,MinLimit=15,MaxLimit=75,ConnectionWaitTimeout=30,InactivityTimeout=300,AbandonedConnectionTimeout=300,ValidateConnection=false)</value>
    </parameter>
    </ResourceParams>
    We get a deadlock situation between two threads and the exact steps are this:
    1) thread1 - The OracleImplicitConnectionClassThread class is executing the runAbandonedTimeout method which will lock the OracleImplicitConnectionCache class with a synchronized block. It will then go thru additional steps and finally try to call the LogicalConnection.close method which is already locked by thread2
    2) thread2 - This thread is doing a standard .close() on the Logical Connection and when it does this it obtains a lock on the LogicalConnection class. This thread then goes through additional steps till it gets to a point in the OracleImplicitConnectionCache class where it executes the reusePooledConnection method. This method is synchronized.
    Actual steps that cause deadlock:
    1) thread1 locks OracleImplicitConnectionClass in runAbandonedTimeout method
    2) thread2 locks LogicalConnection class in close function.
    3) thread1 tries to lock the LogicalConnection and is unable to do this, waits for lock
    4) thread2 tries to lock the OracleImplicitConnectionClass and waits for lock.
    ***DEADLOCK***
    Thread Dumps from two threads listed above
    thread1
    Thread Name : Thread-1 State : Deadlock/Waiting on monitor Owns Monitor Lock on 0x30267fe8 Waiting for Monitor Lock on 0x509190d8 Java Stack at oracle.jdbc.driver.LogicalConnection.close(LogicalConnection.java:214) - waiting to lock 0x509190d8> (a oracle.jdbc.driver.LogicalConnection) at oracle.jdbc.pool.OracleImplicitConnectionCache.closeCheckedOutConnection(OracleImplicitConnectionCache.java:1330) at oracle.jdbc.pool.OracleImplicitConnectionCacheThread.runAbandonedTimeout(OracleImplicitConnectionCacheThread.java:261) - locked 0x30267fe8> (a oracle.jdbc.pool.OracleImplicitConnectionCache) at oracle.jdbc.pool.OracleImplicitConnectionCacheThread.run(OracleImplicitConnectionCacheThread.java:81)
    thread2
    Thread Name : http-7320-Processor83 State : Deadlock/Waiting on monitor Owns Monitor Lock on 0x509190d8 Waiting for Monitor Lock on 0x30267fe8 Java Stack at oracle.jdbc.pool.OracleImplicitConnectionCache.reusePooledConnection(OracleImplicitConnectionCache.java:1608) - waiting to lock 0x30267fe8> (a oracle.jdbc.pool.OracleImplicitConnectionCache) at oracle.jdbc.pool.OracleConnectionCacheEventListener.connectionClosed(OracleConnectionCacheEventListener.java:71) - locked 0x34d514f8> (a oracle.jdbc.pool.OracleConnectionCacheEventListener) at oracle.jdbc.pool.OraclePooledConnection.callImplicitCacheListener(OraclePooledConnection.java:544) at oracle.jdbc.pool.OraclePooledConnection.logicalCloseForImplicitConnectionCache(OraclePooledConnection.java:459) at oracle.jdbc.pool.OraclePooledConnection.logicalClose(OraclePooledConnection.java:475) at oracle.jdbc.driver.LogicalConnection.closeInternal(LogicalConnection.java:243) at oracle.jdbc.driver.LogicalConnection.close(LogicalConnection.java:214) - locked 0x509190d8> (a oracle.jdbc.driver.LogicalConnection) at com.schoolspecialty.cmf.yantra.OrderDB.updateOrder(OrderDB.java:2022) at com.schoolspecialty.cmf.yantra.OrderFactoryImpl.saveOrder(OrderFactoryImpl.java:119) at com.schoolspecialty.cmf.yantra.OrderFactoryImpl.saveOrder(OrderFactoryImpl.java:67) at com.schoolspecialty.ecommerce.beans.ECommerceUtil.saveOrder(Unknown Source) at com.schoolspecialty.ecommerce.beans.ECommerceUtil.saveOrder(Unknown Source) at com.schoolspecialty.ecommerce.beans.UpdateCartAction.perform(Unknown Source) at com.schoolspecialty.mvc2.ActionServlet.doPost(ActionServlet.java:112) at com.schoolspecialty.ecommerce.servlets.ECServlet.doPostOrGet(Unknown Source) at com.schoolspecialty.ecommerce.servlets.ECServlet.doPost(Unknown Source) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.schoolspecialty.ecommerce.servlets.filters.EcommerceURLFilter.doFilter(Unknown Source) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534)

    We used a documented option to abandon connects in the case of an unforeseen error. The consequence of using this option was not a graceful degradation in performance but a complete lockup of the application. The scenario in which we created a moderate number of abandoned connections was a rare error scenario but a valid test.
    How could this not be a bug in the Oracle driver? Is dead-lock a desireable outcome of using an option? Is dead-lock ever an acceptable consequence of using a feature as documented?
    Turns out other Oracle options to recover from an unexpected error also incur a similar deadlock (TimeToLiveTimeout).
    I did a code review of the decompiled drivers and it clearly shows the issue, confirming the original report of this issue. Perhaps you have evidence to the contrary or better evidence to support your statement "not a bug in Oracle"?
    Perhaps you are one of the very few people who have not experience problems with Oracle drivers? I've been using Oracle since 7.3.4 and it seems that I have always been working around Oracle JDBC driver problems.
    We are using Tomcat with the OracleDataSourceFactory.

  • Bug in oracle portal: problem in pl/sql item type

    I created a pl/sql item type... based on a stored proc... whenever I make a change to the store proc I have to readd the item based on this item type since the result on the item type is not updated is this some bug in oracle portal

    I created a pl/sql item type... based on a stored proc... whenever I make a change to the store proc I have to readd the item based on this item type since the result on the item type is not updated is this some bug in oracle portal

Maybe you are looking for