| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Most efficient large update?
Here's the solution:
appl_unq partition (zip9) ; TYPE ROWLIST IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER; TYPE INDLIST IS TABLE OF appl_unq.FINDER_NUMBER_IND%TYPE INDEX BY BINARY_INTEGER; TYPE HHLIST IS TABLE OF appl_unq.FINDER_NUMBER_HH%TYPE INDEX BY BINARY_INTEGER;
RID ROWLIST;
INDID INDLIST;
HH HHLIST;
ROWS NATURAL := 100000;
BEGIN
OPEN HH_CURSOR;
LOOP
FETCH HH_CURSOR BULK COLLECT INTO
RID,
INDID,
HH
limit rows;
FORALL j IN RID.FIRST..RID.LAST
UPDATE appl2 SET
FINDER_NUMBER_HH =HH(j)
WHERE
FINDER_NUMBER_IND = INDID(j);
COMMIT;
EXIT WHEN HH_CURSOR%NOTFOUND;
END LOOP;
CLOSE HH_CURSOR;
V_ERR_MSG := SUBSTR(SQLERRM,1,200);
DBMS_OUTPUT.PUT_LINE('Good Done: ERROR MSG - '|| V_ERR_MSG);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
COMMIT;
V_ERR_MSG := SUBSTR(SQLERRM,1,200);
DBMS_OUTPUT.PUT_LINE('Bad: ERROR CODE - '|| SQLCODE);
DBMS_OUTPUT.PUT_LINE('ERROR MSG - '|| V_ERR_MSG);
COMMIT;
END;
This assumes a partitioned by zip source list.
This code will update 4761 records a second on a 3 CPU
sun 450.
I'll attempt multiple parallel runs to see if I gain that way.
Received on Mon May 28 2001 - 09:21:31 CDT
![]() |
![]() |