5. 자주 하는 실수 (Tip)
실수 1: 프로시저 안에서 COMMIT 한다
끝에 COMMIT 을 넣으면 호출자가 앞뒤 작업과 묶은 트랜잭션이 거기서 끊깁니다. COMMIT 과 ROLLBACK 은 호출자가 합니다.
실수 2: 예외를 삼키고 정상 종료한다
WHEN OTHERS THEN NULL 처럼 잡고 아무것도 하지 않으면 호출자는 성공으로 압니다. 로그를 남기더라도 마지막에 다시 던집니다. 예제 6 처럼 실패한 뒤에도 앞 문장의 변경은 남아 있습니다.
실수 3: MySQL 에서 DELIMITER 를 빠뜨린다
구분자를 바꾸지 않으면 본문 첫 ; 에서 정의가 끊기고 문법 오류가 납니다. 또 바이너리 로그가 켜진 서버에서 DETERMINISTIC 같은 표시 없이 함수를 만들면 정의 자체가 거부됩니다. 서버 설정 log_bin_trust_function_creators 로 우회할 수 있지만 함수 성격을 정확히 표시하는 것이 먼저입니다.
실수 4: 대량 조회에서 행마다 함수를 부른다
SELECT get_grade(sal) FROM big_table 은 행마다 함수 호출입니다. Oracle 은 SQL 과 PL/SQL 사이의 문맥 전환이 행 수만큼 생깁니다. 단순한 판단은 CASE 식으로 풀어 쓰고, 함수는 재사용 가치가 큰 계산에만 씁니다.
실수 5: 업무 로직을 프로시저에만 두고 버전 관리하지 않는다
DB 안의 코드는 배포 절차에서 빠지기 쉽습니다. 누가 언제 바꿨는지 알 수 없고 테스트 환경과 운영이 달라집니다. 프로시저 정의 스크립트를 Git 에 두고 배포 파일에 포함합니다. 재배포는 CREATE OR REPLACE 로 하고, MySQL 은 DROP 후 CREATE 합니다.