Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Cursor script hangs in a loop
try walking through your code. you open a cursor, fetch a row and exit if not found. you then close the cursor and go around again. well, the same row will be fetched the next time around - it's not going to disappear, so your loop will never terminate. also, your update is going to hit every row in the table, as you have no where clause - is this what you want?
assuming you want to put 1 in the first row, 2 in the second etc:
DECLARE
JIM_COUNTER NUMBER(10) := 0;
HOLD_REC_KEY NUMBER(10);
CURSOR COUNT_CURSOR IS
SELECT REC_KEY FROM TEST_COUNTER FOR UPDATE OF REC_KEY;
BEGIN
OPEN COUNT_CURSOR;
FETCH COUNT_CURSOR INTO HOLD_REC_KEY;
while COUNT_CURSOR%FOUND
LOOP
JIM_COUNTER := JIM_COUNTER + 1; UPDATE TEST_COUNTER SET REC_KEY = JIM_COUNTER where current of count_cursor; FETCH COUNT_CURSOR INTO HOLD_REC_KEY;END LOOP;
DECLARE
JIM_COUNTER NUMBER(10) := 0;
CURSOR COUNT_CURSOR IS
SELECT REC_KEY FROM TEST_COUNTER FOR UPDATE OF REC_KEY;
BEGIN
for count_record in COUNT_CURSOR
LOOP
JIM_COUNTER := JIM_COUNTER + 1; UPDATE TEST_COUNTER SET REC_KEY = JIM_COUNTER where current ofcount_cursor;
END LOOP;
COMMIT;
END;
or even
UPDATE TEST_COUNTER SET REC_KEY = ROWNUM;
-- Andrew - Wizzard barnetaj_at_bp.com Jim Lake <jimlake_at_home.com> wrote in article <34FDF843.D47D17AE_at_home.com>...Received on Thu Mar 05 1998 - 00:00:00 CST
> I am trying to get a PL/SQL script to increment a column in a table. The
> following script is what I have come-up with, but it runs in a loop, and
> is a bear to kill. I have moved the close cursor inside and outside the
> loop, but still the same results. Thanks in advance for any help.
>
> DECLARE
> JIM_COUNTER NUMBER(10) := 0;
> HOLD_REC_KEY NUMBER(10);
> CURSOR COUNT_CURSOR IS
> SELECT REC_KEY FROM TEST_COUNTER FOR UPDATE OF REC_KEY;
> BEGIN
> LOOP
> OPEN COUNT_CURSOR;
> FETCH COUNT_CURSOR INTO HOLD_REC_KEY;
> IF COUNT_CURSOR%FOUND THEN
> JIM_COUNTER := JIM_COUNTER + 1;
> UPDATE TEST_COUNTER SET REC_KEY = JIM_COUNTER;
> ELSE
> EXIT;
> END IF;
> CLOSE COUNT_CURSOR;
> END LOOP;
> COMMIT;
> END;
>
>