Avatar billede tipper Nybegynder
14. juni 2001 - 15:22 Der er 7 kommentarer og
1 løsning

While loop stopper ved brug af cursor...hvorfor

sagen er den at der skal slettes i forskellige tabeller, men da disse relatere til hinanden skal det gøres i korrekt rækkefølge. fremmednøgler først og primær efter.
Men uanset hvad jeg gør så stopper while løkken efter 1 omgang. cursorens fetch status bliver sat til -1, men der er flere rækker i cursoren. hvorfor??????


CREATE PROCEDURE EC_DeleteEvent (
@eventID int
)

AS

DECLARE
    @participantID    VARCHAR(10),
    @hotel        VARCHAR(10),
    @flight        VARCHAR(10),
    @counter    int

BEGIN

SELECT @counter = 0;

DECLARE participant CURSOR FOR
    SELECT participantID FROM EC_event_participant WHERE eventID = @eventID;

    OPEN participant

        FETCH NEXT FROM participant INTO @participantID;
        WHILE (@@FETCH_STATUS <> -1)
        BEGIN

        IF @counter < 1
        BEGIN
            DELETE FROM EC_event_participant WHERE eventID = @eventID;

        END;
       
        SELECT @counter + 1

            SELECT @hotel = hotelID, @flight = flightID FROM EC_participant WHERE participantID = @participantID;
       
            DELETE FROM EC_participant WHERE participantID = @participantID;

            IF @hotel IS NOT NULL   
                BEGIN
                    DELETE FROM EC_hotel WHERE hotelID = @hotel;
                END;

            IF @flight IS NOT NULL
                BEGIN   
                    DELETE FROM EC_flight WHERE flightID = @flight;
                END;

        FETCH NEXT FROM participant INTO @participantID;
        END;

    CLOSE participant;
    DEALLOCATE participant;

    DELETE FROM EC_event_employee WHERE eventID = @eventID;
    DELETE FROM EC_event WHERE eventID = @eventID;
   
END;
Avatar billede slash Nybegynder
14. juni 2001 - 15:31 #1
prøv engang at ændre din
FETCH NEXT FROM participant INTO @participantID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN

til dette:       
FETCH NEXT FROM participant INTO @participantID;
WHILE (@@FETCH_STATUS = 0)
BEGIN

når du selecter, så prøv at selecte with(nolock), altså:
select navn from navntabel with(nolock) where id = id
Avatar billede tipper Nybegynder
15. juni 2001 - 10:40 #2
Sorry slash, det virker ikke. Der er et eller andet som trigger FETCH_STATUS til at blive -1...
og jeg er gået kold....
Avatar billede slash Nybegynder
15. juni 2001 - 10:53 #3
prøv lige at studere dette fra sql BOL - kunne det ikke have betydning!:

When a cursor is opened, the current row position in the cursor is logically before the first row. This causes the different fetch options to have the following behaviors if they are the first fetch performed after the cursor is opened:

FETCH FIRST
Fetches the first row in the cursor.

FETCH NEXT
Fetches the first row in the cursor.

FETCH PRIOR
Does not fetch a row.

FETCH LAST
Fetches the last row in the cursor.

FETCH ABSOLUTE n
Fetches the nth row from the first row in the cursor if n is a positive integer. If n is a negative integer, then the row n rows before the end of the cursor is fetched (for example, n = -1 returns the last row in the cursor). If n is 0, no rows are fetched.

FETCH RELATIVE n
Fetches the nth row in the cursor if n is positive. No rows are fetched if n is negative or 0.
Avatar billede slash Nybegynder
15. juni 2001 - 10:54 #4
tanketorsk - glem det :-)
Avatar billede gandalfthewhite Nybegynder
15. juni 2001 - 10:54 #5
OK, jeg tror jeg har et forslag, se bemærkningerne:

--Her henter du participantID
DECLARE participant CURSOR FOR
    SELECT participantID FROM EC_event_participant WHERE eventID = @eventID;

    OPEN participant

        FETCH NEXT FROM participant INTO @participantID;
        WHILE (@@FETCH_STATUS <> -1)
        BEGIN

        IF @counter < 1
        BEGIN
--Her sletter du alle Participants, derfor vil du få -1 på næste fetch, der er nemlig ikke flere tilbage i tabellen.
            DELETE FROM EC_event_participant WHERE eventID = @eventID;

        END;

I stedet for skal du nok hente alle participantID op i #temp tabel, og så bruge den i stedet, så mister du ikke ID\'erne under vejs.
Avatar billede nolle_k Nybegynder
19. juni 2001 - 11:31 #6
Eller også skal du vælge en cursor der ikke opdateres når der slettes fra parent tabellen! En static cursor måske!

//Nolle_K
Avatar billede sunedh Nybegynder
21. juni 2001 - 22:08 #7
Hvorfor anvende en cursor?? De performer ikke særligt godt og kan være ret indviklede at arbejde med. Det skulle da være nok med almindelige DELETE statements - f.eks. for at slette fra tabellen EC_hotel:

DELETE EC_hotel
FROM EC_hotel
INNER JOIN EC_participant ON EC_hotel.hotelID = EC_participant.hotelID
INNER JOIN EC_event_participant ON EC_participant.participantID = EC_event_participant.participantID
WHERE EC_event_participant.eventID = @eventID

Sorry, hvis der skulle være slå-fejl i SQL\'en - et textarea-felt er ikke vildt velegnet som SQL-editor ;o) På samme måde skulle der også kunne slettes fra de øvrige undertabeller, og så er der bare primær tabellerne tilbage.

-Sunedh
Avatar billede tipper Nybegynder
22. august 2001 - 11:42 #8
har løst det
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