2. 핵심 원리
2.1 H2 로 무엇을 보이는가
H2 는 PL/SQL, T-SQL, MySQL 프로시저 문법을 실행하지 못합니다. 그래서 이 레슨은 두 갈래로 나눕니다. 프로시저·함수 정의와 호출은 DB별 코드 블록으로 문법만 검토하고, 결과는 예제 데이터로 그린 도식으로 보입니다.
프로시저 본문이 하는 일은 평문 SQL 입니다. 이 문장들을 H2 에서 그대로 실행해 도식 결과의 근거로 삼습니다. 도식 표에는 (N행) 줄이 없고 위에 "도식(H2 미지원, 실행 결과 아님)" 이라고 적습니다.
2.2 프로시저와 함수의 차이
| 구분 | 프로시저 | 함수 |
|---|---|---|
| 반환 | 없음, OUT 파라미터로 전달 | 값 하나를 RETURN |
| 호출 | EXEC, CALL 같은 별도 문장 | SELECT 안의 식으로 |
세 DB 모두 함수를 SELECT 안에서 부를 수 있지만 행마다 호출됩니다. 대량 조회에서는 느려질 수 있습니다. Oracle 은 SQL 과 PL/SQL 사이의 문맥 전환 비용이 붙습니다.
2.3 DB별 기본형 비교
| 항목 | Oracle · Tibero | MySQL | MSSQL |
|---|---|---|---|
| 언어 | PL/SQL (Tibero 는 tbPSM) | 저장 루틴 문법 | T-SQL |
| 정의 | CREATE OR REPLACE | DROP 후 CREATE | CREATE OR ALTER |
| 파라미터 | (a IN NUMBER, b OUT NUMBER) | (IN a INT, OUT b INT) | @a INT, @b INT OUTPUT |
| 영향 행 수 | SQL%ROWCOUNT | ROW_COUNT() | @@ROWCOUNT |
| 호출 | EXEC p(...) | CALL p(1, @b) | EXEC p 1, @b OUTPUT |
Tibero 는 PL/SQL 호환 언어(tbPSM)를 쓰므로 Oracle 문법을 거의 그대로 옮깁니다. MySQL 에는 CREATE OR REPLACE PROCEDURE 가 없어서 DROP PROCEDURE IF EXISTS 후 CREATE 합니다. MSSQL 의 CREATE OR ALTER 는 2016 SP1 부터입니다.
핵심프로시저는 여러 문장을 이름 하나로 저장해 한 번에 호출하는 도구이고, 세 DB 의 문법은 거의 호환되지 않습니다. 본문 로직이 무엇인지부터 정하고 문법을 입힙니다.
2.4 트랜잭션과 COMMIT
프로시저 안에서 COMMIT 하면 호출한 애플리케이션의 트랜잭션 경계와 어긋납니다. 애플리케이션이 다른 작업과 묶어 롤백하려 해도 이미 확정된 뒤입니다. 그래서 보통 COMMIT 은 호출자가 하고, 프로시저는 DML 만 수행합니다. 실무 06 트랜잭션에서 본 규칙 그대로입니다.