1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
   | CREATE PROCEDURE SupprEd
	@titre VARCHAR(64),
	@complément VARCHAR(128),
	@V_SORTIE INT = 1 OUTPUT
AS
BEGIN
	DECLARE @t_original VARCHAR(64),
			@annee VARCHAR(4),
			@stock INT,
			@cpted INT,
			@bool INT
 
	DECLARE CurEd cursor FOR
	  SELECT TITRE_ORIGINAL, DATE_DE_SORTIE
	  FROM EDITION
	  WHERE TITRE = @titre AND COMPLEMENT_DE_TITRE = @complément
	FOR READ ONLY
 
	OPEN CurEd
	FETCH NEXT FROM CurEd INTO @t_original, @annee
	-- On teste si l'édition existe, si ce n'est pas le cas, on affiche un message d'erreur
	IF(@@FETCH_STATUS != 0) PRINT 'Aucune édition de ce type.'
	BEGIN
		-- Tant que le curseur CURED pointe sur un élément, on effectur les opérations suivantes
			WHILE @@FETCH_STATUS = 0
			BEGIN
				-- S'il une réservation a été faite sur l'édition, on affiche un message d'erreur
				IF EXISTS
				(
					SELECT *
					FROM RESERVATION R
					WHERE R.TITRE = @titre
					AND R.COMPLEMENT_DE_TITRE = @complément
				)
				BEGIN
					PRINT 'Une réservation est prévue sur cette édition...'
					SET @V_SORTIE = 0
				END
				-- Sinon on supprime l'édition et les stocks correspondants
				ELSE
				BEGIN
					DECLARE CurStockAux CURSOR FOR
						SELECT #STOCK
						FROM STOCK
						WHERE TITRE = @titre
						AND COMPLEMENT_DE_TITRE = @complément
					FOR READ ONLY
 
					OPEN CurStockAux
					FETCH NEXT FROM CurStockAux INTO @stock
					SET @cpted = 0
 
					WHILE @@FETCH_STATUS = 0
					BEGIN
						BEGIN TRAN
						-- La procédure SupprStock renvoie 1 si elle s'est déroulée correctement, 0 sinon
						EXECUTE SupprStock
							@stock,
							@V_SORTIE = @bool OUTPUT
 
						-- Si la suppression d'un élément du stock ne s'est pas effectuée correctement (location en cours),
						-- on annule la transaction.
						IF @bool = 0
						BEGIN
						   ROLLBACK TRAN
						END
						ELSE
						BEGIN
							DELETE FROM EDITION
							WHERE TITRE = @titre
							AND COMPLEMENT_DE_TITRE = @complément
 
							COMMIT TRAN
						END
					SET @cpted = @cpted + 1
					FETCH NEXT FROM CurStockAux INTO @stock
				END
				CLOSE CurStockAux
				DEALLOCATE CurStockAux
			END
			PRINT 'L''édition ' + @titre + ' : ' + @complément + ' et les stocks correspondants (' + CAST(@cpted AS varchar) + ') ont été supprimés de la base.'
			FETCH NEXT FROM CurEd INTO @t_original, @annee
		END
		CLOSE CurEd
		DEALLOCATE CurEd
	END
END | 
Partager