ProgramlamaBackend geliştirici, SQL Geliştirici

SQL prosedürlerinde kontrol yapılarının (IF, CASE, döngüler) karmaşık kullanımlarını açıklayın. Hangi durumlarda bu makuldür ve hangi durumlarda yönetimi zorlaştırır? İyi yazılmış bir prosedür örneği verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Çoğu SQL uygulamasında (örneğin, T-SQL, PL/pgSQL, PL/SQL) kontrol yapıları mevcuttur: koşullar (IF/CASE), döngüler (WHILE/FOR/LOOP), hata işleme yapıları. Bunlar, sunucuda iş mantığını otomatikleştirmek için, örneğin karmaşık raporlar oluşturmak, iş kurallarını doğrulamak, ETL süreçlerini orkestra etmek ve olaylara yanıt otomasyonunu yapmak için kullanılabilir.

Ancak, SQL prosedürlerinde döngüler ve karmaşık koşulların aşırı kullanımı okunabilirlik ve performansın düşmesine neden olabilir (SQL'i "emperyal cehennem" haline getirir — procedural hell etkisi).

Bu yapıları yalnızca set-based işlem araçlarıyla gerçekleştirilemeyen işlemler için kullanmanız önerilir: örneğin, dinamik mantıkla her seferinde bir kaydı işlemek için.

İyi yazılmış bir prosedür örneği (T-SQL)

CREATE PROCEDURE ProcessOrders AS BEGIN DECLARE @OrderID INT, @Total FLOAT DECLARE OrderCursor CURSOR FOR SELECT OrderID FROM Orders WHERE Status = 'NEW' OPEN OrderCursor FETCH NEXT FROM OrderCursor INTO @OrderID WHILE @@FETCH_STATUS = 0 BEGIN SELECT @Total = SUM(Price) FROM OrderItems WHERE OrderID = @OrderID IF @Total > 10000 UPDATE Orders SET Status='MANUAL_CHECK' WHERE OrderID=@OrderID ELSE UPDATE Orders SET Status='APPROVED' WHERE OrderID=@OrderID FETCH NEXT FROM OrderCursor INTO @OrderID END CLOSE OrderCursor DEALLOCATE OrderCursor END

Kandırıcı soru

CASE, prosedürlerde iç içe IF koşullarını mı yoksa onu mu değiştirir ve bunlar birbirinin yerine geçebilir mi?

Cevap: Hayır. CASE yalnızca SELECT/UPDATE/INSERT ifadelerinde kullanılabilir — hesaplanmış alanlar için. IF ise yalnızca prosedür/fonksiyon/trigger bloklarında kullanılabilir ve "sadece" SELECT içinde yer almaz.

Örnek:

SELECT CASE WHEN score > 80 THEN 'High' ELSE 'Low' END AS Level FROM students -- IF burada mümkün değil

Gerçek hata örnekleri


Hikaye

Ekip, tüm iş sürecini iç içe geçmiş IF/ELSE ve döngülerle SQL prosedürlerine yeniden yazmayı denedi. Sonuç — karmaşık, hataya kapalı bir kod; destek neredeyse imkansız. Mantığı tekrar uygulamaya taşıyarak yalnızca kritik prosedürleri bıraktılar.


Hikaye

PL/pgSQL'de, çıkış (EXIT) olmadan yanlış LOOP kullanımı nedeniyle bir saklı prosedürde "sonsuz" bir döngü oluştu, DB ile bağlantıyı engelledi. Çalışma koşullarında doğru çıkış koşulları ve döngü tekrarı sınırı eklenerek çözüldü.


Hikaye

Sipariş işleme prosedüründeki iç içe geçmiş IF mantığında bir hata: ELSE yapısı eksikti. Bazı siparişler yanlış durumda (NULL) kaldı ve sonraki doğrulama eksik kaldı. Açık bir varsayılan davranış belirten bir ELSE yapılandırması eklendi.