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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, OrderDate DATETIME, Status VARCHAR(20) DEFAULT 'Pending', TotalAmount DECIMAL(10, 2) DEFAULT 0 );
CREATE TABLE OrderItems ( ItemID INT PRIMARY KEY, OrderID INT, ProductID INT, Quantity INT, UnitPrice DECIMAL(10, 2), FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) );
CREATE TABLE OrderProcessingLog ( LogID INT IDENTITY(1,1) PRIMARY KEY, OrderID INT, ProcessDate DATETIME, Action VARCHAR(100), OldStatus VARCHAR(20), NewStatus VARCHAR(20) );
INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES (1, 101, '2023-01-01'), (2, 102, '2023-01-02'), (3, 103, '2023-01-03');
INSERT INTO OrderItems VALUES (1, 1, 1001, 2, 25.50), (2, 1, 1002, 1, 120.00), (3, 2, 1003, 3, 15.75), (4, 2, 1004, 1, 200.00), (5, 3, 1005, 5, 10.25), (6, 3, 1006, 2, 45.00);
DECLARE @OrderID INT; DECLARE @CustomerID INT; DECLARE @OrderDate DATETIME; DECLARE @OldStatus VARCHAR(20); DECLARE @TotalAmount DECIMAL(10, 2); DECLARE @ProcessedCount INT = 0; DECLARE @ErrorCount INT = 0;
DECLARE OrderCursor CURSOR FOR SELECT OrderID, CustomerID, OrderDate, Status FROM Orders WHERE Status = 'Pending' ORDER BY OrderDate;
OPEN OrderCursor;
BEGIN TRANSACTION;
FETCH NEXT FROM OrderCursor INTO @OrderID, @CustomerID, @OrderDate, @OldStatus;
WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY SELECT @TotalAmount = SUM(Quantity * UnitPrice) FROM OrderItems WHERE OrderID = @OrderID; UPDATE Orders SET Status = 'Processed', TotalAmount = @TotalAmount WHERE OrderID = @OrderID; INSERT INTO OrderProcessingLog (OrderID, ProcessDate, Action, OldStatus, NewStatus) VALUES (@OrderID, GETDATE(), 'Order processed', @OldStatus, 'Processed'); SET @ProcessedCount = @ProcessedCount + 1; IF @CustomerID % 10 = 0 BEGIN INSERT INTO OrderProcessingLog (OrderID, ProcessDate, Action, OldStatus, NewStatus) VALUES (@OrderID, GETDATE(), 'VIP customer processed', 'Processed', 'Processed'); PRINT 'VIP customer order processed: OrderID = ' + CAST(@OrderID AS VARCHAR); END PRINT 'Order processed successfully: OrderID = ' + CAST(@OrderID AS VARCHAR); END TRY BEGIN CATCH PRINT 'Error processing order: ' + CAST(@OrderID AS VARCHAR) + '. Error: ' + ERROR_MESSAGE(); INSERT INTO OrderProcessingLog (OrderID, ProcessDate, Action, OldStatus, NewStatus) VALUES (@OrderID, GETDATE(), 'Error: ' + ERROR_MESSAGE(), @OldStatus, 'Error'); UPDATE Orders SET Status = 'Error' WHERE OrderID = @OrderID; SET @ErrorCount = @ErrorCount + 1; END CATCH FETCH NEXT FROM OrderCursor INTO @OrderID, @CustomerID, @OrderDate, @OldStatus; END
COMMIT TRANSACTION;
CLOSE OrderCursor;
DEALLOCATE OrderCursor;
PRINT 'Processing completed.'; PRINT 'Orders processed successfully: ' + CAST(@ProcessedCount AS VARCHAR); PRINT 'Orders with errors: ' + CAST(@ErrorCount AS VARCHAR);
SELECT * FROM Orders; SELECT * FROM OrderProcessingLog ORDER BY ProcessDate DESC;
|