Avatar billede starfire Nybegynder
22. januar 2008 - 15:45 Der er 3 kommentarer og
1 løsning

Oracle Cursor spørgsmål

Hej,

Jeg er ret ny i Oracle's verden og jeg kigger på Cursors nu. Jeg kan godt få det til at virke, men det give mig et sjovt resultat.

Jeg har tabellen "test" med 2 entries.
SELECT * FROM test; giver 2 rows, naturligvis.

Så laver jeg et lille script.

DECLARE
    a VARCHAR(10);
    b VARCHAR(10);
    CURSOR cur IS
        SELECT * FROM test;
BEGIN
    OPEN cur;
    FETCH CUR INTO a, b;
    LOOP
        -- dette loop outputter 3 rows, den sidste bliver printet 2 gange!
        dbms_output.put_line('a = ' || a || ', b = ' || b);
        EXIT WHEN cur%NOTFOUND;
    END LOOP;
    dbms_output.put_line(cur%ROWCOUNT); -- her outputtes 2
    CLOSE cur;
END;

Hvis jeg har flg. i min tabel, test:

    col1      col2
-------------------
1 | abc        def
2 | ghi        jkl

Så vil scriptet outputte:

a = abc, b = def
a = ghi, b = jkl
a = ghi, b = jkl <-- hvor kommer denne linie fra? hvad gør jeg galt i mit loop? Hvis det er korrekt virkemåde og jeg istedet skal tilføje noget, er det så muligt at kunne forklare hvorfor at den gør således?
Avatar billede lap Nybegynder
22. januar 2008 - 15:53 #1
Det skyldes at din EXIT WHEN cur%NOTFOUND; skal ligge lige efter FETCH - dine variable er fortsat indeholdende den sidste gældende record - altså ghi-jkl rækken.

Flyt din EXIT og det virker.
Avatar billede starfire Nybegynder
22. januar 2008 - 15:59 #2
Det virkede sørme :) Tusind tak for det!
Avatar billede binuyogi Nybegynder
22. januar 2008 - 18:01 #3
Hi,

  Can you please send your problem to me in English, i can solve it

Email Me: binuyogi@hotmail.com

Thanks,
Binu
Avatar billede pgroen Nybegynder
22. januar 2008 - 21:15 #4
I øvrigt kunne du forenkle din kode ved at bruge en implicit cursor:

BEGIN
  FOR rec1 in (SELECT * FROM test) LOOP
    dbms_output.put_line('a = ' || rec1.col1 || ', b = ' || rec1.col1);
  END LOOP;
END;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester