프로그래밍백엔드 개발자, SQL 개발자

SQL 절차에서 제어 구조(IF, CASE, 루프)의 복합적인 사용을 설명하세요. 이러한 사용이 정당화되는 경우와 행정을 복잡하게 만드는 경우는 무엇인가요? 잘 작성된 절차의 예를 제시하세요.

Hintsage AI 어시스턴트로 면접 통과

답변

대부분의 SQL 구현(예: T-SQL, PL/pgSQL, PL/SQL)에서 제어 구조(조건문(IF/CASE), 루프(WHILE/FOR/LOOP), 오류 처리 구조)를 사용할 수 있습니다. 이러한 구조는 서버에서 비즈니스 로직을 자동화하는 데 유용하며, 예를 들어 복잡한 보고서 생성, 비즈니스 규칙 유효성 검사, ETL 프로세스 오케스트레이션 및 이벤트 반응 자동화에 활용됩니다.

하지만 SQL 절차 내에서 루프와 복잡한 조건의 과도한 사용은 가독성과 성능 저하로 이어질 수 있습니다(이는 SQL을 "명령형 지옥"으로 바꾸는 절차적 지옥 효과를 초래합니다).

이러한 구조는 네트워크(set-based) 처리 수단으로 구현할 수 없는 작업, 즉 동적인 로직을 가진 단일 레코드 처리와 같은 작업에만 사용하는 것이 권장됩니다.

잘 작성된 절차의 예 (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

속임수를 포함한 질문

CASE가 SELECT의 중첩 IF 조건을 대체할 수 있는가? 그들은 서로 대체 가능합니까?

답변: 아니요. CASE는 SELECT/UPDATE/INSERT 문 내의 계산 필드에만 적용할 수 있습니다. IF는 절차/함수/트리거의 제어 블록 내에서만 사용 가능하며 "순수한" SELECT 문에서는 사용할 수 없습니다.

예시:

SELECT CASE WHEN score > 80 THEN 'High' ELSE 'Low' END AS Level FROM students -- IF는 여기서 불가능함

실제 오류의 예


이야기

팀은 복잡한 중첩 IF/ELSE와 루프가 포함된 SQL 절차로 비즈니스 프로세스를 전환하려고 했습니다. 결과는 엉켜서 디버깅이 불가능한 코드였으며, 지원이 사실상 불가능했습니다. 중요 절차만 남기고 나머지 로직을 애플리케이션으로 되돌리기로 했습니다.


이야기

PL/pgSQL에서 적절한 종료(OUTPUT)가 없는 LOOP의 잘못된 사용으로 인해 저장 프로시저에서 "무한" 루프가 발생하여 DB 연결이 차단되었습니다. 반복 제한과 적절한 종료 조건을 도입하여 해결했습니다.


이야기

주문 처리 절차의 중첩 IF 논리에 오류가 있었습니다: ELSE 구조가 없었습니다. 일부 주문이 잘못된 상태(NULL)에 남았으며, 후속 유효성 검사가 부족했습니다. 명시적인 기본 동작을 가진 점검 ELSE를 추가했습니다.