SQL에서 서브프로그램은 두 가지 유형이 있습니다:
CALL/EXEC를 사용하여 호출되며, 항상 SELECT 층에서 사용되지는 않습니다.중요:
스칼라 함수 예제 (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를 알지 못하게 되었고, 통합이 "붕괴"되었습니다.
이야기
프로젝트: 다양한 규칙에 따라 세금을 계산하는 금융 서비스. 오류: 성능 테스트 없이 대량 쿼리에서 스칼라 함수를 사용하여 쿼리가 테이블 처리를 지연시켰습니다(최적화되지 않은 계획).