Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

How to Determine Whether to Insert or Update

Avi AbramiMar 14 2005 — edited Mar 15 2005
Folks,
First some background, then my question.

I am using Oracle 9i (9.2.0.4) on SUN [sparc] Solaris 9

I have a (parent) table:

create table PARENT (ID number primary key);

And a child table:

create table CHILD (PARENT_ID number, ORDERING number,
primary key (PARENT_ID, ORDERING),
foreign key PARENT_ID references PARENT (ID))

I have a PL/SQL procedure that updates the parent table, and the child table. The procedure receives a string containing a delimited list of database table and column names and values that are used to locate and update a single row in table PARENT as well as any associated rows in table CHILD. If a row doesn't exist in table CHILD, a new row is created and if the row does exist, it is updated.

The string parameter (that is passed to the procedure) is parsed and SQL statements are generated according to which tables, columns and values are found. Native dynamic SQL is used to execute the generated SQL statements.

There is a one-to-many relationship between PARENT and CHILD. In other words, there may be zero, one or several (but never more than three) rows in table CHILD with the same PARENT_ID column value.

I am looking for the most efficient way to determine whether I need to insert into or update table CHILD. Currently (and this is code I inherited -- I didn't write it originally) I have this:
[NOTE: This is a very simplified version of my code, for illustration only.]
procedure P (P_LIST varchar2) is
  L_COUNT number;
  L_SQL   varchar2(2000);
begin
  -- parse P_LIST
  if P_LIST /* contains table CHILD */ then
    select count(1) into L_COUNT
    from CHILD
    where PARENT_ID = P_ID
    and ORDERING = P_ORDERING
    and ROWNUM < 2;

    if L_COUNT > 0 then
      L_SQL := 'update CHILD set -- whatever ' ||
               'where PARENT_ID = P_ID and ORDERING = P_ORDERING';
    else
      L_SQL := 'insert into CHILD (PARENT_ID, ORDERING) ' ||
               'values (P_ID, ORDERING)';
    end if;
    execute immediate L_SQL;
  end if;
end;
Thanks (in advance) for any suggestions,
Avi.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 12 2005
Added on Mar 14 2005
3 comments
768 views