TopLink inserts when it should update, unique constraint exception

The title says most of it. I am creating a series of objects and then updating them in rapid succession. It would be great to handle all the values during the insert, but it's not possible for this process. The majority of the time, the cached object is updated correctly and no problem occurs, but every once in a while TopLink tries to re-insert the previously inserted object, instead of updating it. Obviously this throws a unique constraint exception for the PK, and boots me out of the process.
I can refreshObject and then it works fine. I'm looking for the underlying cause though. I want to be able to use the cache!
Thanks!!
Aaron
Oracle JDBC driver Version: 10.2.0.3.0
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
TopLink Release-Designation: 10g Release 3

Hello,
How are you obtaining these objects to update them? The likely cause is that you are running out of memory and the objects in the shared identity map are getting garbage collected due to weak references. This means that when they get registered, TopLink can't find them in the cache so assumes they are new (the default existence check is check cache).
If this is the case, there are a few options.
1) Increase the size of the cache for the class in question to something more appropriate for your application, or use a fullIdentyMap so nothing ever gets pushed out. Of course, a FullIdentityMap should not be used lightly as it prevents its objects from beign gc'd and has consequences to related objects as described in:
Caching Causing Memory Leak Effect
Both these options will require more memory resources though, so if garbage collection is running and clearing out the references because you are already low on memory, this might make GC need to run more frequently
2) Increase the JVM memory. This assumes completely that GC is clearing out the unused weak references from your cache because it is low on memory - GC can still occur so it doesn't guarantee the problem will be any better
3) Read in the object through the UnitofWork before making changes (instead of using RegisterObject on existing objects), use the registerExistingObject for known existing objects or use the uow mergeClone method. Merge should cause the object to be read from the database if it is not in the cache, but it depends on the existence options used
Best Regards,
Chris

Similar Messages

  • Reattempt of insert after a ORA-0001 unique constraint violation

    Hi,
    I'm inserting into a table. The primary key on this table is made up of the user id and a one-up transaction number. Unfortunately, I cannot change the design of this table.
    Because I have to query the table to get the next transaction number before I insert into the table, I sometimes get a ORA-0001 (unique constraint violation) error because some other session grabbed the next transaction number and committed before I did.
    To deal with this I retry the insert, that is, read the table again for the next tran number and insert. I allow for this up to 3 times. If after the third attempt I fail again, I rollback.
    I'm seeing 3 records in the table.
    So here are my questions: Do I need to rollback when I get the ORA-0001 error? I thought I wouldn't have to. If I do, why? The insert failed, how could the commit statement commit 3 records?
    Thanks!

    No, the userid and transaction numbers are not the same (combined) for each of the 3 rows.
    Here is the logic to retry again when I get a ORA-0001:
    PROCEDURE insert_record(
    table1_rec_in IN table1%ROWTYPE,
    tran_number OUT table1.trans_number%TYPE,
    attempt_number IN PLS_INTEGER)
    IS
    next_tran_number table1.trans_number%TYPE;
    BEGIN
    SELECT NVL(MAX(trans_number), 0) + 1
    INTO next_tran_number
    FROM table1
    WHERE userid = table1_rec_in.table1_userid;
    INSERT INTO table1
    (userid,
    trans_number,
    amount,
    transdate)
    VALUES
    (table1_rec_in.userid,
    next_tran_number,
    table1_rec_in.amount,
    SYSDATE);
    tran_number := next_tran_number;
    EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
    IF attempt_number < 3
    THEN
    DECLARE
    next_attempt_number PLS_INTEGER;
    BEGIN
    next_attempt_number := attempt_number + 1;
    insert_record(
    table1_rec_in,
    tran_number,
    next_attempt_number);
    END;
    ELSE
    RAISE unable_to_insert_rec;
    END IF;
    WHEN OTHERS THEN
    RAISE unable_to_insert_rec;
    END;
    I'm using recursion to try the insert again. Is this the source of my problems? I don't see it and can't reproduce it.

  • Handling unique constraint exception

    Hi,
    I have a problem with handling constraint exception. I'm wondering is there a way to get the value that violates unique constraint. Use case is following, user creates document and then adds 50 records and manually enters inventory and serial numbers that should be unique he tries to commit but since he entered let's say inventory number that already exists in database I get exception and I can only show him error message "you've entered non unique inventory or serial numbers" so then he has to go record by record and try to figure where is the mistake. it would be much easier if I could tell him that there's a duplicate inventory and serial number in record number 34. is this possible?
    thanks in advance,
    Tomislav.

    Tomislav,
    May be a good case to use a custom DBTransactionImpl, as detailed [url http://forums.oracle.com/forums/thread.jspa?threadID=700740&tstart=0]here. Something like this, perhaps (just off the top of my head):
      public void postChanges(TransactionEvent te)
        try
          super.postChanges(te);
        catch (DMLConstraintException ex)
          Row r = ex.getEntityRow();
          AttributeDef attrs[] = r.getStructureDef().getAttributeDefs();
          int numAttrs = attrs.length;
          String msg = "Duplicate key found. Primary key values: ";
          for (int i = 0; i < numAttrs; i++)
            if (attrs.isPrimaryKey())
    msg = msg + attrs[i].getName() + ":" + r.getAttribute(i).toString() + " ";
    throw new JboException(msg);
    Note that this code would catch all DML exceptions, not just unique key violations. That would be left as an exercise for the reader ;)
    John

  • OAF-Checkbox when selected should update column in a table

    Hello,
    I have a requirement to add checkbox to MES Operator page and it should perform the following,
    1) When MES Operator page is opened, it should read attribute1(Y/N) from table and accordingly check/uncheck checkbox.
    2) When checkbox is checked/unchecked in the page, it should write Y/N to attribute1 column of a table.
    I was able to successfully add the checkbox and perform the first requirement by extending the View Object.
    Can someone please tell me how to proceed with the second requirement?
    Thanks in advance.

    Hi ,
    Pls go through this thread this will definitely help you.
    How to get current row value from table when press the submit button
    The problem is that PPR is added through the code which is not considered as table event .
    Need to go with a tricky way ,
    1.) create a new seperate table region using Jdeveloper and it shud be replica of standrad once except the new ppr event addition to the check box.
    2.) Hide the existing table region and create a new stacklayoutbean.
    3.) this stacklayout bean will have the extend property ,there you give the complete path of new custom advanced table region.
    Now you should be able to get the row refernce on the click of check box button.

  • Unique constraint is not thrown when used MERGE INSERT (alone) via dblink.

    We found some interesting behaviour of unique constraint on Merge query when we use Merge When Not Matched Insert (no update query) via a dblink.
    In one Schema S1, on Table A1(c1,c2,c3) there is a unique constraint on column (c1,c2).
    Column c2 is nullable and has null for some records.
    Now i have a table A2 with same defintion as A1 in Schema S2.In S2 , i have a dblink of S1 as S1 itself.
    I have data in S2.A2. Here also i have some records with c2 as null and c1 matching with the data of S1.A1.
    Now from schema S2,
    I am using the following Merge Query,
    MERGE INTO S1.A1 target
    USING S2.A2 source
    ON (target.c1 = source.c1 and target.c2 = source.c2)
    WHEN NOT MATCHED
    INSERT (c1,c2,c3) values (source.c1, source.c2,source.c3)
    WHEN MATCHED
    UPDATE c3 = source.c3;
    Now when i execute this merge in schema S2,
    if i have some data in S1.A1 and S2.A2 having c1 as same and c2 as null, as oracle does not treat two nulls same, it goes for an insert, i have got unique constraint violated error.
    But if i execute MERGE INSERT alone, though that record is getting inserted , i am not getting unique constraint violated error.
    Oracle version we are using is 10g (10.2...).
    Is it a bug in oracle or what could have caused this behaviour.

    Dear,
    ERROR at line 1:
    ORA-00001: unique constraint (SYS_C00137508) violatedYou need to think about two things
    (a) read consistency : what was the situation of table_1 when the maching clause has been initially evaluated ; there were 0 rows matching which means the merge operation will be all insert
    (b) your matching clause has a problem : the join column must be unique in both tables otherwise the merge will be ambigous. You don't have a unique key on the source table
    (c) think that the merge operation will never insert id =1 and then update id = 1 within the same operation. This will never happen
    Hope this helps
    Mohamed Houri

  • Unique constraint violation on version enabled table

    hi!
    we're facing a strange problem with a version enabled table that has an unique constraint on one column. if we rename an object stored in the table (the name-attribute of the object is the one that has a unique constraint on the respective column) and rename it back to the old name again, we get an ORA-00001 unique constraint violation on the execution of an update trigger.
    if the constraint is simply applied as before to the now version enabled table, I understand that this happens, but shouldn't workspace manager take care of something like that when a table with unique constraints is version enabled? (the documentation also says that) because taking versioning into account it's not that we try to insert another object with the same name, it's the same object at another point in time now getting back it's old name.
    we somewhat assume that to be a pretty standard scenario when using versioned data.
    is this some kind of bug or do we just miss something important here?
    more information:
    - versioning is enabled on all tables with VIEW_WO_OVERWRITE and no valid time support
    - database version is 10.2.0.1.0
    - wm installation output:
    ALLOW_CAPTURE_EVENTS OFF
    ALLOW_MULTI_PARENT_WORKSPACES OFF
    ALLOW_NESTED_TABLE_COLUMNS OFF
    CR_WORKSPACE_MODE OPTIMISTIC_LOCKING
    FIRE_TRIGGERS_FOR_NONDML_EVENTS ON
    NONCR_WORKSPACE_MODE OPTIMISTIC_LOCKING
    NUMBER_OF_COMPRESS_BATCHES 50
    OWM_VERSION 10.2.0.1.0
    UNDO_SPACE UNLIMITED
    USE_TIMESTAMP_TYPE_FOR_HISTORY ON
    - all operations are done on LIVE workspace
    any help is appreciated.
    EDIT: we found out the following: the table we are talking about is the only table where the unique constraint is left. so there must have been a problem during version enabling. on another oracle installation we did everything the same way and the unique constraint wasn't left there, so everything works fine.
    regards,
    Andreas Schilling
    Message was edited by:
    aschilling

    hi!
    we're facing a strange problem with a version enabled table that has an unique constraint on one column. if we rename an object stored in the table (the name-attribute of the object is the one that has a unique constraint on the respective column) and rename it back to the old name again, we get an ORA-00001 unique constraint violation on the execution of an update trigger.
    if the constraint is simply applied as before to the now version enabled table, I understand that this happens, but shouldn't workspace manager take care of something like that when a table with unique constraints is version enabled? (the documentation also says that) because taking versioning into account it's not that we try to insert another object with the same name, it's the same object at another point in time now getting back it's old name.
    we somewhat assume that to be a pretty standard scenario when using versioned data.
    is this some kind of bug or do we just miss something important here?
    more information:
    - versioning is enabled on all tables with VIEW_WO_OVERWRITE and no valid time support
    - database version is 10.2.0.1.0
    - wm installation output:
    ALLOW_CAPTURE_EVENTS OFF
    ALLOW_MULTI_PARENT_WORKSPACES OFF
    ALLOW_NESTED_TABLE_COLUMNS OFF
    CR_WORKSPACE_MODE OPTIMISTIC_LOCKING
    FIRE_TRIGGERS_FOR_NONDML_EVENTS ON
    NONCR_WORKSPACE_MODE OPTIMISTIC_LOCKING
    NUMBER_OF_COMPRESS_BATCHES 50
    OWM_VERSION 10.2.0.1.0
    UNDO_SPACE UNLIMITED
    USE_TIMESTAMP_TYPE_FOR_HISTORY ON
    - all operations are done on LIVE workspace
    any help is appreciated.
    EDIT: we found out the following: the table we are talking about is the only table where the unique constraint is left. so there must have been a problem during version enabling. on another oracle installation we did everything the same way and the unique constraint wasn't left there, so everything works fine.
    regards,
    Andreas Schilling
    Message was edited by:
    aschilling

  • Unique Constraint on a Table

    I want to have a unique constraint on deptno and emp_name in emp table.
    What I want is:
    Any Dept can have 100 Steves OR 100 Johns but only 1 Robert
    Dept No               Emp Name     
    10               Steve
    10               Steve
    10               Robert
    20               Steve
    20               Robert
    20                John
    20               John
    How can we achieve this with unique constraint??
    Cheers
    Prasad.

    You are talking about unique constraint and you want to have duplicate records in a column with unique constraint. No, what you want is not possible with unique constraint. When you have a unique constraint on emp_name, how can you have 100 johns or 100 steves. Forget about 100, you can't have the second john/steve.

  • OWB Update/Insert throwing unique constraint ..

    Hello Al,
    I am currently facing issue when it is supposed to update/Insert the records in OWB10gR2.
    Also there are no duplicates in the source data while doing this.
    Any help is appreceated.
    Thanks,
    Suresh
    Edited by: user8745316 on Jul 27, 2010 12:58 AM

    Hi Nawneet,
    Thanks for the reply.
    My issue is something like this , there were duplicates from the source and we deleted them but still it gives this error @ Unique constraint voilated errror.
    I also can understand that as we have same matching records by key columns from source and target which should ideally be doing the update and if non matching should be inserting which is not happening now.
    can you please suggest me the issue.
    Thanks for your help.
    Suresh

  • Unique constraint fired when updating in MERGE statement.

    Hi guys
    I have an issue which I am unable to resolve. Would appreciate any help on this. The data setup and the scenario is as below.
    SQL*Plus: Release 10.2.0.1.0 - Production on Wed May 4 11:46:02 2011
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    SQL>
    create table table_1
    (id number,
    id_name varchar2(20));
    Alter table table_1 add primary key(id);
    create table table_2
    (id number,
    id_name varchar2(20));
    insert into table_2 values (1, 'id_1');
    insert into table_2 values (2, 'id_2');
    insert into table_2 values (1, 'id_1_upd');
    SQL> select * from table_1;
    no rows selected
    SQL> select * from table_2;
            ID ID_NAME
             1 id_1
             2 id_2
             1 id_1_upd
    SQL>
    SQL>  merge into table_1 target
      2   using (select id,
      3                 id_name
      4            from table_2) source
      5   on (source.id = target.id)
      6   when matched then
      7      update set target.id_name = source.id_name
      8   when not matched then
      9      insert(id,
    10             id_name)
    11      values(source.id,
    12             source.id_name);
    merge into table_1 target
    ERROR at line 1:
    ORA-00001: unique constraint (SYS_C00137508) violated
    SQL> ed
    Wrote file afiedt.buf
      1  select constraint_type, table_name, status
      2*   from user_constraints where constraint_name = 'SYS_C00137508'
    SQL> /
    C TABLE_NAME                     STATUS
    P TABLE_1                        ENABLEDCan someone please help me in resolving this as the actual code that I am developing has the same setup and I am constantly getting this error. So long as the same record does not come up in the "source" table, MERGE does either an update or an insert.
    But as soon a "duplicate" record comes up for updation, I am getting the unique constraint error.
    Thanks
    - K.B.

    Dear,
    ERROR at line 1:
    ORA-00001: unique constraint (SYS_C00137508) violatedYou need to think about two things
    (a) read consistency : what was the situation of table_1 when the maching clause has been initially evaluated ; there were 0 rows matching which means the merge operation will be all insert
    (b) your matching clause has a problem : the join column must be unique in both tables otherwise the merge will be ambigous. You don't have a unique key on the source table
    (c) think that the merge operation will never insert id =1 and then update id = 1 within the same operation. This will never happen
    Hope this helps
    Mohamed Houri

  • Unique constraint error but key when inserting unique keys!

    Hi,
    I am tring to update an existing database with some older data, I am getting an error which complains about a unique constraint being violated although there is no voilation evident after testing.
    I am puzzled by this and was wondering if someone could give me any extra info on another possible cause.
    I googled but found that this error is caused by duplicating primary keys which I am not doing though I still get this error.
    I run this query then the update and get the output below:
    desc test_sales;
    desc sales_order;
    SELECT order_id FROM sales_order WHERE order_id IN (SELECT order_id FROM test_Sales);
    INSERT INTO sales_order
    (order_id,order_date,customer_id, ship_date,total)
    SELECT 
          order_id,
          order_date,
          cust_id,
          ship_date,
          total
    FROM
          test_sales;
    desc test_sales;
    Name                           Null     Type                                                                                                                                                                                         
    ------------------------------ -------- CUST_ID                                 NUMBER(6)                                                                                                                                                                                    
    OLD_SYSTEM_ID                           VARCHAR2(25)                                                                                                                                                                                 
    DESCRIPTION                             VARCHAR2(35)                                                                                                                                                                                 
    ORDER_DATE                              DATE                                                                                                                                                                                         
    SHIP_DATE                               DATE                                                                                                                                                                                         
    QUANTITY                                NUMBER                                                                                                                                                                                       
    ORDER_ID                       NOT NULL NUMBER(4)                                                                                                                                                                                    
    ITEM_ID                        NOT NULL NUMBER(4)                                                                                                                                                                                    
    SITE_COUNT                              NUMBER(2)                                                                                                                                                                                    
    TOTAL                                   NUMBER(8,2)                                                                                                                                                                                  
    PRODUCT_CODE                            NUMBER(6)                                                                                                                                                                                    
    LIST_PRICE                              NUMBER(8,2)                                                                                                                                                                                  
    12 rows selected
    desc sales_order;
    Name                           Null     Type                                                                                                                                                                                         
    ------------------------------ -------- ORDER_ID                       NOT NULL NUMBER(4)                                                                                                                                                                                    
    ORDER_DATE                              DATE                                                                                                                                                                                         
    CUSTOMER_ID                             NUMBER(6)                                                                                                                                                                                    
    SHIP_DATE                               DATE                                                                                                                                                                                         
    TOTAL                                   NUMBER(8,2)                                                                                                                                                                                  
    5 rows selected
    ORDER_ID              
    0 rows selected
    Error starting at line 7 in command:
    INSERT INTO sales_order
    (order_id,order_date,customer_id, ship_date,total)
    SELECT 
          order_id,
          order_date,
          cust_id,
          ship_date,
          total
    FROM
          test_sales
    Error report:
    SQL Error: ORA-00604: error occurred at recursive SQL level 1
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 8
    ORA-00001: unique constraint (MICHAELKELLY.SYS_C00210356) violatedMessage was edited by:
    Mike1981
    Message was edited by:
    Mike1981

    ORA-00001: unique constraint (MICHAELKELLY.SYS_C00210356) violated
    => check dba_cons_columns to see what the constraint actually exists off

  • Insert called before delete in a collection with unique constraint

    Hi all,
    I have a simple @OneToMany private mapping:
    private Collection<Item> items;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    public Collection<Item> getItems() {
    return items;
    public void setItems(Collection<Item> items) {
    this.items = items;
    public void customize(ClassDescriptor classDescriptor) throws Exception {
    OneToManyMapping mapping = (OneToManyMapping)
    classDescriptor.getMappingForAttributeName("items");
    mapping.privateOwnedRelationship();
    I have a unique constraint on my Items table that a certain value cannot be duplicated.
    My problem appears when I remove a previously saved item from the collection and add a new item containing the same data, at the same time.
    After I save the parent and do a flush, I receive SQLIntegrityConstraintViolationException because TopLink performs first an insert query instead of deleting the existing item.
    I tested the application and everything went fine with: remove item / save parent / insert item / save parent
    I checked on the Internet and the documentation but didn't find anything similar to my problem. I tried debugging TopLink's internal calls but I'm missing some general ideas about all the inner workings and don't know what to look for. I use TopLink version: Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))
    Does anyone have a hint of what to look for?
    Edited by: wise_guybg on Sep 25, 2009 4:01 PM
    Edited by: wise_guybg on Oct 5, 2009 11:22 AM

    Thank you for the suggestions James
    As I mentioned briefly I have done some debugging but couldn't understand how collections are updated. What I did find out is that setShouldPerformDeletesFirst() doesn't come into play in this case because this is not a consecutive change on entities.
    What I have in my case is a collection inside an entity that the user has tampered with and now TopLink has to do a merge. I cannot call flush() in the middle since the user has not approved that the changes made to the entity should be saved.
    I see that for TopLink it's not easy to figure out the order in which changes were made to a collection. Here is pseudo-code of when the constraint is touched:
    entity.items.remove(a)
    entity.items.add(b)
    merge(entity)
    And here is code that executes without a problem:
    entity.items.remove(a)
    merge(entity)
    entity.items.add(b)
    merge(entity)
    So once again, I think that collection changes are managed differently but I don't find a way to tell TopLink how to handle them. Any ideas?

  • Unique constraint ERROR How to update the task order customly?

    I am using DAC to load data from Siebel database into Oracle Business Analytic Data Warehouse for BI Apps. Now we encounter a question. I need some help.
    When I run current execute plan, the Custom_shyy_SIL_ActivityFact is failured.Beause the *'unique constraint (SHYY_OLAP_DEV.W_ACTIVITY_F_U1) violated'* ORA_00001 ERROR. I analyse this question.At last, I think this question is caused with some below reason.
    My custom execute plan include some Update Dimension from Dimension tasks. They are SIL_EmployeeDimension_SCDUpdate and SIL_ProductDimension_SCDUpdate and so no. that tasks that marked Update Dimension from Dimension run before the Custom_shyy_SIL_ActivityFact. And, in the w_product_d one integration_id corresponding with two records, but the curent_flag ='Y' recored is only. Now ,I Think the SDCU Task is run before the Load fact tack. I discoved it does't work. please help me !

    Hey
    When Doing a full Load through DAC it drops all the unique indexes and then inserts the data and recreates the indexes again.The Index Creation fails if there are duplicate rows (Rows with same integration_id).
    So start Checking the Data right from the Source Level.
    First check the Source (do this using the integration_id thats repeating,Go through the informatica Mappings(ETL Mappings).
    If its Fine there Come to the Staging Level and Check for Duplicate Columns.
    Then Check in the final Table for Duplicate records.
    My Guess is that you are having duplicate rows at the Source level.
    If your are using informatica try using distinct for the SQL in the Source Qualifier(think that should block any duplicate records).
    Update here If you are able to solve this.
    Thanks
    Hemanth

  • ORA-00001:Unique Constraint while inserting 2 similar records from source

    Hi,
    in TEST1 there are records:
    10 20 ABC
    10 20 DEF
    I amt trying to insert into TEST which has CODE as Primary Key.
    declare
    type cur is ref cursor;
    cur_t cur;
    type v_t is table of TEST%rowtype;
    tab v_t;
    v_act_cnt_str VARCHAR2(4000);
    v_act_cnt NUMBER:=0;
    BEGIN
    v_act_cnt_str:=' SELECT COUNT(*) '||' FROM TEST '||' WHERE '||'('||CODE||')'||' IN '||'('||'SELECT '||CODE||' FROM TEST1'||')';
    DBMS_OUTPUT.PUT_LINE('The Actual Count String is'||v_act_cnt_str);
    EXECUTE IMMEDIATE v_act_cnt_str INTO v_act_cnt;
    open cur_t for select * from TEST1 ORDER BY ROWNUM;
    loop
    fetch cur_t bulk collect into tab limit 10000;
    if v_act_cnt=0 THEN
    forall i in 1..tab.count
    insert into TEST values tab(i);
    commit;
    ELSE
    v_merge_act_str :=
    'MERGE INTO TEST '||
    ' DEST' || ' USING TEST1 '||
    ' SRC' || ' ON (' || DEST.CODE=SRC.CODE || ')' ||
    ' WHEN MATCHED THEN ';
    first_str := 'UPDATE ' || ' SET ' ||
    'DEST.NAME=SRC.NAME,DEST.DEPT_NAME=SRC.DEPT_NAME;
    execute immediate v_merge_act_str || first_str;
    v_merge_act_str := '';
    first_str := '';
    commit;
    END IF;
    end loop;
    END;
    ITS GIVING ERROR as:
    ORA-00001: unique constraint (PK_TEST1) violated
    Any help will be needful for me
    Edited by: user598986 on Sep 22, 2009 4:20 AM
    Edited by: user598986 on Sep 22, 2009 4:22 AM

    Your code makes absolutely no sense whatsover. The whole point of MERGE is that it allows us to conditionally apply records from a source table as inserts or updates to a target table. So why have you coded two separate statements? And why are you using such horrible dynamic SQL?
    Sorry to unload on you, but you seem to have your code unnecessarily complicated, and that it turn makes it unnecessarily harder to debug. As an added "bonus" this approach will also perform considerably slower than a single MERGE statement. SQL is all about set operations. Don't do anything procedurally which can be done in a set.
    Cheers, APC
    blog: http://radiofreetooting.blogspot.com

  • Unique constraint violation while updating a non PK column

    Hi,
    I seem to have found this strange error.
    What I try to do is bulk fetch a cursor in some table arrays. with limit of 1000
    Then using a forall and a save exceptions at the end
    I update a table with the values inside one of the table arrays.
    The column I update is not part of a PK
    I catch the error message: ORA-24381
    by using PRAGMA exception_init(dml_errors, -24381);
    and later on :
    WHEN dml_errors THEN
    errors := SQL%BULK_EXCEPTIONS.COUNT;
    FOR i IN 1..sql%BULK_EXCEPTIONS.count LOOP
    lr_logging.parameters:= 'index = ' || sql%BULK_EXCEPTIONS(i).error_index || 'error = ' ||Sqlerrm(-sql%BULK_EXCEPTIONS(i).error_code) ;
    END LOOP;
    I insert these errors in another table. and i get 956 errors
    first one is :
    index = 3error = ORA-00001: unique constraint (.) violated
    last one is
    index = 1000error = ORA-00001: unique constraint (.) violated
    How can this be.Since i don't update in a PKcolumn.
    FULL CODE IS:
    PROCEDURE Update_corr_values( as_checkdate_from IN VARCHAR2,
    as_checkdate_until IN VARCHAR2,
    as_market IN VARCHAR2
    IS
    LS_MODULE_NAME CONSTANT VARCHAR2(30) := 'update_values';
    lr_logging recon_logging.logrec;
    CURSOR lc_update IS
    SELECT /*+ORDERED*/c.rowid,c.ralve_record_id,d.value,c.timestamp,f.value
    FROM rcx_allocated_values a,
    rcx_allocated_values b,
    meter_histories e,
    rcx_allocated_lp_value c,
    rcx_allocated_lp_value d,
    counter_values f
    WHERE a.slp_type NOT IN ('S89', 'S88', 'S10', 'S30') --AELP
    AND b.slp_type IN ('S89', 'S88') --residu
    AND a.valid_from >= to_date(as_checkdate_from,'DDMMYYYY HH24:MI')
    AND a.valid_to <= to_date(as_checkdate_until,'DDMMYYYY HH24:MI')
    AND a.market = as_market
    AND a.market = b.market
    AND a.ean_sup = b.ean_sup
    AND a.ean_br = b.ean_br
    AND a.ean_gos = b.ean_gos
    AND a.ean_dgo = b.ean_dgo
    AND a.direction = b.direction
    AND a.valid_from = b.valid_from
    AND a.valid_to = b.valid_to
    AND c.ralve_record_id = a.record_id
    AND d.ralve_record_id = b.record_id
    AND c.TIMESTAMP = d.TIMESTAMP
    AND e.ASSET_ID = 'KCF.SLP.' || a.SLP_TYPE
    --AND f.timestamp between to_date(gs_checkdate_from,'ddmmyyyy') and to_Date(as_checkdate_until,'ddmmyyyy')
    AND e.SEQ = f.MHY_SEQ
    AND f.TIMESTAMP =c.timestamp - 1/24
    ORDER BY c.rowid;
    TYPE t_value IS TABLE OF RCX_ALLOCATED_LP_VALUE.VALUE%TYPE;
    TYPE t_kcf IS TABLE OF COUNTER_VALUES.VALUE%TYPE;
    TYPE t_timestamp IS TABLE OF RCX_ALLOCATED_LP_VALUE.TIMESTAMP%TYPE;
    TYPE t_ralverecord_id IS TABLE OF RCX_ALLOCATED_LP_VALUE.RALVE_RECORD_ID%TYPE;
    TYPE t_row IS TABLE OF UROWID;
    ln_row t_row :=t_row();
    lt_value t_value := t_Value();
    lt_kcf t_kcf := t_kcf();
    lt_timestamp t_timestamp := t_timestamp();
    lt_ralve t_ralverecord_id := t_ralverecord_id();
    v_bulk NUMBER := 1000;
    val number;
    kcf number;
    ralve number;
    times date;
    dml_errors EXCEPTION;
    errors NUMBER;
    PRAGMA exception_init(dml_errors, -24381);
    BEGIN
    --setting arguments for the logging record
    lr_logging.module := LS_MODULE_NAME;
    lr_logging.context := 'INFLOW_ALL_VALUES_PARTS';
    lr_logging.logged_by := USER;
    lr_logging.parameters := 'Date time started: ' || TO_CHAR(sysdate,'DD/MM/YYYY HH24:MI');
    -- log debugs
    recon_logging.set_logging_env (TRUE, TRUE);
    recon_logging.log_event(lr_logging,'D');
    OPEN lc_update;
    LOOP
    FETCH lc_update BULK COLLECT INTO ln_row,lt_ralve,lt_value,lt_timestamp,lt_kcf LIMIT v_bulk;
    FORALL i IN NVL(lt_value.first,1)..NVL(lt_value.last,0) SAVE EXCEPTIONS
    UPDATE RCX_ALLOCATED_LP_VALUE
    SET VALUE = VALUE * lt_value(i) * lt_kcf(i)
    WHERE rowid =ln_row(i);
    COMMIT;
    lt_value.delete;
    lt_timestamp.delete;
    lt_ralve.delete;
    lt_kcf.delete;
    ln_row.delete;
    EXIT WHEN lc_update%NOTFOUND;
    END LOOP;
    CLOSE lc_update;
    recon_logging.log_event(lr_logging,'D');
    lr_logging.parameters := 'Date time ended: ' || TO_CHAR(sysdate,'DD/MM/YYYY HH24:MI');
    recon_logging.log_event(lr_logging,'D');
    --to be sure
    COMMIT;
    EXCEPTION
    WHEN dml_errors THEN
    recon_logging.set_logging_env(TRUE,TRUE);
    lr_logging.module := 'updatevalues';
    lr_logging.context := 'exception';
    lr_logging.logged_by := USER;
    lr_logging.parameters := 'in dml_errors';
    recon_logging.log_event(lr_logging);
    errors := SQL%BULK_EXCEPTIONS.COUNT;
    lr_logging.parameters:=errors;
    recon_logging.log_event(lr_logging);
    lr_logging.parameters :=('Number of errors is ' || errors);
    --DBMS_OUTPUT.PUT_LINE('Number of errors is ' || errors);
    FOR i IN 1..sql%BULK_EXCEPTIONS.count LOOP
    lr_logging.parameters:= 'index = ' || sql%BULK_EXCEPTIONS(i).error_index || 'error = ' ||Sqlerrm(-sql%BULK_EXCEPTIONS(i).error_code) ;
    recon_logging.log_event(lr_logging);
    END LOOP;
    --recon_logging.set_logging_env(TRUE,TRUE);
    --recon_logging.log_event(lr_logging);
    commit;
    WHEN OTHERS THEN
    lr_logging.module := 'updatevalues';
    lr_logging.context := 'exception';
    lr_logging.logged_by := USER;
    recon_logging.set_logging_env(TRUE,TRUE);
    lr_logging.parameters := 'in others error=' || SQLERRM;
    recon_logging.log_event(lr_logging);
    commit;--to look which is truly the last (else only commit after 1000)
    --raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
    END Update_corr_values;

    Hi,
    No I didn't update a unique constraint.
    But I found out that there is a trigger that causes the unique constraint while updating in the table.
    Silly mistake.Didn't know there was a trigger there.
    Thx anyway.
    Greetz

  • Unique constraint error on delete/insert

    Hi,
    I am using Jdeveloper 11.1.1.3.0. I have a ADF table where we can copy lines and delete lines. I get unique constraint error when I save. Looks like the insert operation in happening before the delete operation. Is there a way to set the execution order so that the logical behaviour is delete/update/insert.
    Thanks
    SV

    Hi,
    The unquie contraint is not from the primary key. There are three columns in the table (batch_id, line_number, line_type) which must be unique. In the UI, the user can delete lines, update lines and add lines and finally click the save button that does the commit. On delete the line_number gets re-numbered. So when committing, the unique error occurs because the line number already exists. Looks like insert is happening before update/delete. I cannot do commit after each delete/update/insert. I have to do it only if the user clicks the save button in the end. Is there a way to control the order of execution?
    SR

Maybe you are looking for

  • Changing to english

    when i try to use pages it is in spanish

  • Ipod stops after each track ends in a playlist?

    I have a problem: Suddenly, my ipod stops after each track ends in a playlist.  This happens with every playlist and every track, all of which worked fine until this week.  All tracks' settings are "yes" on 1) part of a compilation; 2) remember playb

  • Printer not recognizing ANY paper in tray 3

    Have installed the optional tray 3 onto my printer. Have changed the paper size in trays 2 and 3 on both the printer and on my pc. No matter the size of paper, how much paper, or how I choose to print it (force to tray 3) it ALWAYS says to load paper

  • Time zone MST not valid in country US  warning message in SC

    Hi Gurus, When we are trying to create the SC, we are getting the warning message as "Time zone MST not valid in country US (several possibilities)". we need to switch off this message.  Message no: AM 482 Some one can help me how to switch of this m

  • Leopard on older Laptop Macs

    Would anyone recommend installing Leopard (with Tiger archived for older applications) on an older laptop computer or would this result in a slower running computer? Thanks for any ideas