From: jimmyb on
On Dec 14, 10:39 am, Shakespeare <what...(a)xs4all.nl> wrote:
> jimmyb schreef:
>
> > On Dec 13, 4:21 pm, Steve Howard <stevedhow...(a)gmail.com> wrote:
> >> On Dec 12, 1:41 am, Mladen Gogala <gogala.mla...(a)gmail.com> wrote:
>
> >>> Why not simply use the merge statement?
> >>> --http://mgogala.byethost5.com
> >> This is a regular event in our shop.  Our developers used to try to
> >> insert, and then handle the exception if it existed and update it.  We
> >> cut our redo by a large factor when we asked them to switch to MERGE.
>
> > They used to do an UPDATE when an exception was raised? That should be
> > a bad coding practice in every shop, JMO.
>
> Not if the exception is a dup-val-on-index. Its a practice seen all around!
>
> Shakespeare

Shakespeare, that is probablly correct. I have seen it done with the
dup_val_on_index exception, now that you mention it.

Where I work we cannot use a merge statement because of VPD. You get
ORA-28132: Merge into syntax does not support security policies. So
what I did was create two cursors, one for update and one for insert.
Then use two PL/SQL blocks, one for each cursor with a FORALL
statement. I doubt if it is faster, just another where of doing it.

From: Shakespeare on
jimmyb schreef:
> On Dec 14, 10:39 am, Shakespeare <what...(a)xs4all.nl> wrote:
>> jimmyb schreef:
>>
>>> On Dec 13, 4:21 pm, Steve Howard <stevedhow...(a)gmail.com> wrote:
>>>> On Dec 12, 1:41 am, Mladen Gogala <gogala.mla...(a)gmail.com> wrote:
>>>>> Why not simply use the merge statement?
>>>>> --http://mgogala.byethost5.com
>>>> This is a regular event in our shop. Our developers used to try to
>>>> insert, and then handle the exception if it existed and update it. We
>>>> cut our redo by a large factor when we asked them to switch to MERGE.
>>> They used to do an UPDATE when an exception was raised? That should be
>>> a bad coding practice in every shop, JMO.
>> Not if the exception is a dup-val-on-index. Its a practice seen all around!
>>
>> Shakespeare
>
> Shakespeare, that is probablly correct. I have seen it done with the
> dup_val_on_index exception, now that you mention it.
>
> Where I work we cannot use a merge statement because of VPD. You get
> ORA-28132: Merge into syntax does not support security policies. So
> what I did was create two cursors, one for update and one for insert.
> Then use two PL/SQL blocks, one for each cursor with a FORALL
> statement. I doubt if it is faster, just another where of doing it.
>
I guess if you don't want to use exceptions, you have to check for
existence of the row first, which takes an extra roundtrip to the
server. And how do you keep track of records that could not be updated
but should be inserted or vice versa? The exception method seems so much
easier to me....


Shakespeare
From: lora on
Yikes, the DBMS_ERRLOG is not working on my end.

SQL> EXEC dbms_errlog.create_error_log( 'MYTAB');
BEGIN dbms_errlog.create_error_log( 'MYTAB'); END;

*
ERROR at line 1:
ORA-20069: Unsupported column type(s) found: REQUEST2 RESPONSE
ORA-06512: at "SYS.DBMS_ERRLOG", line 233
ORA-06512: at line 1



On Dec 13, 3:14 pm, Kenneth Koenraadt <k...(a)mail-online.dk> wrote:
> On 11 Dec., 23:47, Thomas Kellerer <OTPXDAJCS...(a)spammotel.com> wrote:
>
>
>
>
>
> > lora wrote on 11.12.2009 23:41:
>
> > > Hello all,
>
> > > I need to update as many rows as possible. The issue is that one row
> > > that fails causes the entire transaction to fail.
>
> > > How do I get around this? I'd like to complete all UPDATE rows that
> > > don't have the exception. The below doesn't seem to work.
>
> > > I'm using Oracle 10g
>
> > > Thanks a bunch!
>
> > > BEGIN
> > > UPDATE MYTAB SET request = REPLACE(request, '$tpsToModify',
> > > 'tpsToModify') WHERE request like '%$tpsToModify%';
> > >   EXCEPTION
> > >      when dup_val_on_index then
> > >          dbms_output.put_line('DUPLICATE RECORD');
>
> > > END;
>
> > Use the error logging clause:
>
> > Details are here:http://download-uk.oracle.com/docs/cd/B19306_01/appdev..102/b14258/d_e......
>
> > The examples all use INSERT, but you can use that with UPDATE just as wellhttp://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/sta...
>
> > Thomas- Skjul tekst i anførselstegn -
>
> > - Vis tekst i anførselstegn -
>
> Hi Thomas,
>
> That's interesting : The online doc clearly states that UPDATE works
> just as INSERT's regarding error logging..however, I have this simple
> test case, which works with INSERT's, but not UPDATE's. The OP wanted
> just that, so it may not work for him. Any thoughts ?
>
> -------------------------
>
> SQL> create table daf as select * from dba_objects where rownum <=5;
>
> Tabel er oprettet.
>
> SQL> create unique index daf_object_id_idx on daf(object_id);
>
> Indeks er oprettet.
>
> SQL> exec DBMS_ERRLOG.CREATE_ERROR_LOG('DAF','DAF_ERR');
>
> PL/SQL-procedure er udf°rt.
>
> -- Now try to violate unique constraint with an INSERT
>
> SQL> insert into daf select * from daf where rownum <=1 log errors
> into daf_err ('INSERTING') reject limit unlimited;
>
> 0 rµkker er oprettet.
>
> -- Correct, row isn't inserted, and error is recorded in the error log
> table
> SQL> select count(*) from daf_err;
>
>   COUNT(*)
> ----------
>          1
>
> -- Now try to violate unique constraint with an UPDATE
>
> SQL> select object_id from daf order by object_id;
>
>  OBJECT_ID
> ----------
>         15
>         20
>         28
>         29
>         44
>
> SQL> update daf set object_id = 20 where object_id = 15 log errors
> into daf_err ('UPDATING') reject limit unlimited;
> update daf set object_id = 20 where object_id = 15 log errors into
> daf_err ('UPDATING') reject limit unlimited
> *
> FEJL i linie 1:
> ORA-00001: unik begrµnsning (A.DAF_OBJECT_ID_IDX) er overtrÕdt
>
> -- Wrong, Got execption, and row isn't recorded in DAF_ERR
> SQL> select count(*) from daf_err;
>
>   COUNT(*)
> ----------
>          1
>
> - Kenneth Koenraadt- Hide quoted text -
>
> - Show quoted text -

From: jimmyb on
On Dec 14, 12:34 pm, Shakespeare <what...(a)xs4all.nl> wrote:
> jimmyb schreef:
>
>
>
> > On Dec 14, 10:39 am, Shakespeare <what...(a)xs4all.nl> wrote:
> >> jimmyb schreef:
>
> >>> On Dec 13, 4:21 pm, Steve Howard <stevedhow...(a)gmail.com> wrote:
> >>>> On Dec 12, 1:41 am, Mladen Gogala <gogala.mla...(a)gmail.com> wrote:
> >>>>> Why not simply use the merge statement?
> >>>>> --http://mgogala.byethost5.com
> >>>> This is a regular event in our shop.  Our developers used to try to
> >>>> insert, and then handle the exception if it existed and update it.  We
> >>>> cut our redo by a large factor when we asked them to switch to MERGE..
> >>> They used to do an UPDATE when an exception was raised? That should be
> >>> a bad coding practice in every shop, JMO.
> >> Not if the exception is a dup-val-on-index. Its a practice seen all around!
>
> >> Shakespeare
>
> > Shakespeare, that is probablly correct. I have seen it done with the
> > dup_val_on_index exception, now that you mention it.
>
> > Where I work we cannot use a merge statement because of VPD. You get
> > ORA-28132: Merge into syntax does not support security policies. So
> > what I did was create two cursors, one for update and one for insert.
> > Then use two PL/SQL blocks, one for each cursor with a FORALL
> > statement. I doubt if it is faster, just another where of doing it.
>
> I guess if you don't want to use exceptions, you have to check for
> existence of the row first, which takes an extra roundtrip to the
> server. And how do you keep track of records that could not be updated
> but should be inserted or vice versa? The exception method seems so much
> easier to me....
>
> Shakespeare- Hide quoted text -
>
> - Show quoted text -

I let the cursors determine if a record should be updated or inserted.

-- person_id primary key in both tables

-- only update records that exists in both source and target tables
-- and the data has changed
select u..person_id, s.name, s.a_email_addr
from source_table s ,
users u
where
s.person_id = u.person_id
and
( nvl(s.name,' ') != nvl(u.name,' ')
or nvl(s.a_email_addr, ' ') != nvl(u.a_email_addr,' ')
) ;


-- insert records that exists in source table, but not in the target
table
select s..person_id, s.name, s.a_email_addr
from source_table s
where
not
exists ( select null
from users u
where u.person_id = s.person_id) ;

From: jimmyb on
On Dec 14, 1:01 pm, lora <anjela_...(a)yahoo.com> wrote:
> Yikes, the DBMS_ERRLOG is not working on my end.
>
> SQL> EXEC dbms_errlog.create_error_log( 'MYTAB');
> BEGIN dbms_errlog.create_error_log( 'MYTAB'); END;
>
> *
> ERROR at line 1:
> ORA-20069: Unsupported column type(s) found: REQUEST2 RESPONSE
> ORA-06512: at "SYS.DBMS_ERRLOG", line 233
> ORA-06512: at line 1
>
> On Dec 13, 3:14 pm, Kenneth Koenraadt <k...(a)mail-online.dk> wrote:
>
>
>
> > On 11 Dec., 23:47, Thomas Kellerer <OTPXDAJCS...(a)spammotel.com> wrote:
>
> > > lora wrote on 11.12.2009 23:41:
>
> > > > Hello all,
>
> > > > I need to update as many rows as possible. The issue is that one row
> > > > that fails causes the entire transaction to fail.
>
> > > > How do I get around this? I'd like to complete all UPDATE rows that
> > > > don't have the exception. The below doesn't seem to work.
>
> > > > I'm using Oracle 10g
>
> > > > Thanks a bunch!
>
> > > > BEGIN
> > > > UPDATE MYTAB SET request = REPLACE(request, '$tpsToModify',
> > > > 'tpsToModify') WHERE request like '%$tpsToModify%';
> > > >   EXCEPTION
> > > >      when dup_val_on_index then
> > > >          dbms_output.put_line('DUPLICATE RECORD');
>
> > > > END;
>
> > > Use the error logging clause:
>
> > > Details are here:http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_e......
>
> > > The examples all use INSERT, but you can use that with UPDATE just as wellhttp://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/sta....
>
> > > Thomas- Skjul tekst i anførselstegn -
>
> > > - Vis tekst i anførselstegn -
>
> > Hi Thomas,
>
> > That's interesting : The online doc clearly states that UPDATE works
> > just as INSERT's regarding error logging..however, I have this simple
> > test case, which works with INSERT's, but not UPDATE's. The OP wanted
> > just that, so it may not work for him. Any thoughts ?
>
> > -------------------------
>
> > SQL> create table daf as select * from dba_objects where rownum <=5;
>
> > Tabel er oprettet.
>
> > SQL> create unique index daf_object_id_idx on daf(object_id);
>
> > Indeks er oprettet.
>
> > SQL> exec DBMS_ERRLOG.CREATE_ERROR_LOG('DAF','DAF_ERR');
>
> > PL/SQL-procedure er udf°rt.
>
> > -- Now try to violate unique constraint with an INSERT
>
> > SQL> insert into daf select * from daf where rownum <=1 log errors
> > into daf_err ('INSERTING') reject limit unlimited;
>
> > 0 rµkker er oprettet.
>
> > -- Correct, row isn't inserted, and error is recorded in the error log
> > table
> > SQL> select count(*) from daf_err;
>
> >   COUNT(*)
> > ----------
> >          1
>
> > -- Now try to violate unique constraint with an UPDATE
>
> > SQL> select object_id from daf order by object_id;
>
> >  OBJECT_ID
> > ----------
> >         15
> >         20
> >         28
> >         29
> >         44
>
> > SQL> update daf set object_id = 20 where object_id = 15 log errors
> > into daf_err ('UPDATING') reject limit unlimited;
> > update daf set object_id = 20 where object_id = 15 log errors into
> > daf_err ('UPDATING') reject limit unlimited
> > *
> > FEJL i linie 1:
> > ORA-00001: unik begrµnsning (A.DAF_OBJECT_ID_IDX) er overtrÕdt
>
> > -- Wrong, Got execption, and row isn't recorded in DAF_ERR
> > SQL> select count(*) from daf_err;
>
> >   COUNT(*)
> > ----------
> >          1
>
> > - Kenneth Koenraadt- Hide quoted text -
>
> > - Show quoted text -- Hide quoted text -
>
> - Show quoted text -

Are you using large objects or other object types? I don't think those
are supported.