프로그래밍데이터베이스 개발자 / DB 아키텍트

SQL에서 재사용 가능한 비즈니스 로직을 구현하기 위해 서브프로그램(프로시저/함수)을 올바르게 생성하고 사용하는 방법, 그리고 매개변수 및 반환 값 관리에 대한 세부사항은 무엇인가요?

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

답변.

SQL에서 서브프로그램은 두 가지 유형이 있습니다:

  • 프로시저 (Stored Procedures): 작업(삽입, 업데이트, 삭제)을 수행하며, OUT 매개변수 또는 행 집합(SELECT를 통해)을 반환할 수 있습니다. CALL/EXEC를 사용하여 호출되며, 항상 SELECT 층에서 사용되지는 않습니다.
  • 함수 (User Defined Functions, UDF): 값을 반환(스칼라 또는 테이블)하며, SELECT, WHERE, ORDER BY 등 기타 구성에서 직접 사용될 수 있습니다.

중요:

  • 프로시저는 일반 SELECT에서 사용할 수 없으며, 오직 EXEC/CALL로 호출해야 합니다.
  • 함수는 하나의 값(스칼라) 또는 테이블(테이블 함수)만 반환할 수 있으며, 모든 표현식에서 사용할 수 있습니다.
  • 항상 매개변수를 문서화하십시오: IN(입력), OUT(결과 반환), INOUT(양방향).

스칼라 함수 예제 (PostgreSQL):

CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- 사용 예: SELECT *, get_tax(price) AS tax FROM product;

저장 프로시저 예제 (SQL Server):

CREATE PROCEDURE add_employee(@name NVARCHAR(100), @salary INT, @emp_id INT OUTPUT) AS BEGIN INSERT INTO employees (name, salary) VALUES (@name, @salary); SET @emp_id = SCOPE_IDENTITY(); END; DECLARE @id INT; EXEC add_employee 'John', 100000, @id OUTPUT;

함정 질문.

저장 프로시저를 직접 SELECT에서 사용할 수 있나요?

많은 사람들이 "예"라고 대답하지만, 이는 잘못된 것입니다.

답변:

  • 불가능합니다: 표준 프로시저는 별도로(EXEC/CALL) 호출되어야 하며, 함수는 SELECT에서 사용할 수 있습니다.

주제의 세부사항을 모르는 경우 발생할 수 있는 실제 오류 예시.


이야기

프로젝트: 초기 회계 시스템, 보고서 구현. 오류: 합계를 계산하는 함수 대신 프로시저를 작성하여 SELECT가 작동하지 않았고, 사용자가 보고서의 모든 로직을 다시 작성해야 했습니다.


이야기

프로젝트: 외부 매개변수를 가진 ERP 시스템. 오류: 프로시저에 OUT 키를 설정하지 않아 고객이 추가된 기록의 ID를 알지 못하게 되었고, 통합이 "붕괴"되었습니다.


이야기

프로젝트: 다양한 규칙에 따라 세금을 계산하는 금융 서비스. 오류: 성능 테스트 없이 대량 쿼리에서 스칼라 함수를 사용하여 쿼리가 테이블 처리를 지연시켰습니다(최적화되지 않은 계획).