# Stored Procedure - Cursor



## cam (6. Jan 2009)

Hallo,

ich finde den Fehler im folgenden Code nicht. Wenn fachG01 = 1 ist, dann wird mir auch richtig fach2 ausgegeben, wenn aber fachG01 = 3 ist, wird für fach1 und fach2 NULL ausgegeben, warum?
Es wird aber nachdem herausgefunden wurde, dass fach 2 belegt ist, richtig als nächste Möglichkeit fachG01 = 3 angegeben.



```
CREATE PROCEDURE boxG0
	@reihe CHAR(1) OUTPUT
	, @spalte CHAR(1) OUTPUT
	, @ebene CHAR(1) OUTPUT
	, @fach1 CHAR(1) OUTPUT
	, @fach2 CHAR(1) OUTPUT
	AS
		BEGIN
			DECLARE @reiheG0 CHAR(1), @spalteG0 CHAR(1), @ebeneG0 CHAR(1), @fachG01 CHAR(1)
			DECLARE c_G0 CURSOR FOR
				SELECT reihe, spalte, ebene, fach FROM la_platz WHERE mgl_g0 = '1' AND belegt = '0' AND reserv = '0'
			OPEN c_G0
			FETCH c_G0 INTO @reiheG0, @spalteG0, @ebeneG0, @fachG01			
			IF(@fachG01 = '1')
			BEGIN				
				DECLARE @belegt1 BIT, @reserviert1 BIT
				DECLARE c_G0fach2_1 CURSOR FOR
					SELECT belegt, reserv FROM la_platz WHERE reihe = @reiheG0 AND spalte = @spalteG0 AND ebene = @ebeneG0 AND fach = '2'
				OPEN c_G0fach2_1
				FETCH c_G0fach2_1 INTO @belegt1, @reserviert1				
				IF(@belegt1 = '0' AND @reserviert1 = '0')
				BEGIN
					SET @fach1 = '1'
					SET @fach2 = '2'
				END
				ELSE
					FETCH NEXT FROM c_G0
				CLOSE c_G0fach2_1
				DEALLOCATE c_G0fach2_1
			END
			IF(@fachG01 = '3')
			BEGIN				
				DECLARE @belegt3 BIT, @reserviert3 BIT
				DECLARE c_G0fach2_3 CURSOR FOR
					SELECT belegt, reserv FROM la_platz WHERE reihe = @reiheG0 AND spalte = @spalteG0 AND ebene = @ebeneG0 AND fach = '4'
				OPEN c_G0fach2_3
				FETCH c_G0fach2_3 INTO @belegt3, @reserviert3				
				IF(@belegt3 = '0' AND @reserviert3 = '0')
				BEGIN
					SET @fach1 = '3'
					SET @fach2 = '4'
				END
				ELSE
					FETCH NEXT FROM c_G0
				CLOSE c_G0fach2_3
				DEALLOCATE c_G0fach2_3
			END
			SET @reihe = @reiheG0;
			SET @spalte = @spalteG0;
			SET @ebene = @ebeneG0;
			CLOSE c_G0
			DEALLOCATE c_G0
		END
	GO
	DECLARE @reiheG0 CHAR(1), @spalteG0 CHAR(1), @ebeneG0 CHAR(1), @fachG01 CHAR(1), @fachG02 CHAR(1)
	EXECUTE boxG0 @reiheG0 OUTPUT, @spalteG0 OUTPUT, @ebeneG0 OUTPUT, @fachG01 OUTPUT, @fachG02 OUTPUT
	SELECT @reiheG0, @spalteG0, @ebeneG0, @fachG01, @fachG02
```


----------



## cam (7. Jan 2009)

Also den Fehler habe ich inzwischen gefunden, aber ich weiß nicht, wie ich ihn beheben kann.
In den Zeilen 28 und 45 muss es heißen:

```
FETCH NEXT FROM c_G0 INTO @reiheG0, @spalteG0, @ebeneG0, @fachG01
```

Aber das muss irgendwie VOR Zeile 15?

Kann mir damit vielleicht jemand helfen? Bitte?


----------



## cam (12. Jan 2009)

Also ich habe das ganze inzwischen mit "GOTO" gelöst.


----------

