6. 정리
- 저장 프로시저는 여러 문장을 DB 안에 이름으로 저장해 한 번에 실행합니다. 네트워크 왕복이 줄고 권한을 분리할 수 있습니다.
- 업무 로직이 DB 에 숨어 버전 관리, 테스트, 이식이 어렵습니다. 본문 로직을 평문 SQL 로 먼저 확인하고 DB 문법으로 옮깁니다.
- Oracle 은
CREATE OR REPLACE PROCEDURE p (a IN NUMBER, b OUT NUMBER) IS ... BEGIN ... END;이고 Tibero 는 PL/SQL 호환 언어(tbPSM)입니다. - MySQL 은 DELIMITER 를 바꿔
CREATE PROCEDURE p (IN a INT, OUT b INT)로 정의하고CALL p(1, @b); SELECT @b;로 호출합니다. - MSSQL 은
CREATE PROCEDURE p @a INT, @b INT OUTPUT AS이고 2016 SP1 부터 CREATE OR ALTER, 호출은EXEC p 1, @b OUTPUT;입니다. - 영향 행 수는 SQL%ROWCOUNT, ROW_COUNT(), @@ROWCOUNT 입니다.
- 예외는 Oracle EXCEPTION 과 RAISE_APPLICATION_ERROR(-20000 ~ -20999), MySQL HANDLER 와 SIGNAL SQLSTATE '45000', MSSQL TRY...CATCH(2005)와 THROW(2012)입니다. 핸들러는 오류를 삼키지 않고 다시 던집니다.
- 함수는 값 하나를 RETURN 하고 SELECT 안에서 호출됩니다. 행마다 호출되어 대량 조회에서 느려질 수 있습니다. MySQL 은 바이너리 로그가 켜져 있으면 DETERMINISTIC 같은 표시가 필요합니다.
- 프로시저 안의 COMMIT 은 호출자의 트랜잭션 경계와 어긋나므로 COMMIT 은 호출자가 합니다. 호출은 CallableStatement 나 MyBatis 의 statementType="CALLABLE" 로 합니다.
- 다음 레슨은 데이터 이관과 검증 쿼리입니다.