Procedure

✒️ 2025-05-28 17:28 내용 수정


참고 자료 : 위키백과 저장 프로시저, iBM SQL 프로시저, 코딩의성지's MSSQL 저장 프로시저(Stored Procedure)란?, logical-code PL/SQL 프로시저(PROCEDURE)

일련의 query를 마치 하나의 함수처럼 실행하기 위한 query의 집합

특징

  1. 장점

    • 하나의 요청으로 여러 SQL문을 실행할 수 있다.
    • 미리 구분 분석 및 내부 중간 코드로 변환을 끝내야 하므로 처리 시간이 줄어든다.
    • 데이터베이스 트리거와 결합하여 복잡한 규칙에 의한 데이터의 참조무결성 유지를 할 수 있다.
      • 응용 프로그램 측 로직을 가지지 않아도 데이터베이스의 앞 뒤가 맞는다.
    • Java와 같은 호스트 언어와 SQL 문장이 확실하게 분리된 소스 코드로 인해 웹 사이트 등을 운용 중이더라도 프로시저 교체에 의한 수정이 가능해 유지 보수에 유용하다.
    • SQL을 따로 저장한 파일을 수정하기 쉽고, 한 번 저장해 놓은 프로시저를 다시 실행할 수 있어 재사용도 쉽다.
  2. 단점

    • 문자나 숫자 연산에 사용하면 오히려 성능이 느릴 수 있다.
    • 최적화 단계에서 인덱스 사용 여부를 결정하는데, 대량의 데이터 처리에 인덱스를 사용하면 오히려 성능이 하락한다.
    • 비즈니스 로직의 일부로 사용할 경우 업무 사양 변경 등으로 인해 응용 프로그램과 저장 프로시저의 정의를 변경해야 할 경우, 수정 과정에서 발생하는 실수로 인한 오류 등이 발생할 수 있다.

Oracle의 Procedure

CREATE OR REPLACE PROCEDURE procedure_name
( -- 매개변수 지정
	param1 IN DATATYPE:= 값,
	param2 IN DATATYPE%TYPE,
	리턴값 OUT DATATYPE -- 리턴값
)
IS -- 선언부. 함수 내에서 사용한 변수, 상수 등 선언.
	VAR1 DATATYPE;
	VAR2 TABLE_A.COLUMN_A%TYPE;
BEGIN -- 실행부
	실행할 명령;
END procedure_name;

MySQL의 Procedure

DELIMITER //
CREATE PROCEDURE procedure_name(
	IN param1 DATATYPE, 
	IN param2 DATATYPE
)
BEGIN
	DECLARE param1 DATATYPE;
    DECLARE param2 DATATYPE;

	
	SELECT * FROM test 
	WHERE id = param1 AND name = param2;
END//
DELIMITER ;
CALL procedure_name(param1, param2)

Procedure를 사용한 검색 함수

DELIMITER //
CREATE PROCEDURE test_search(IN keyword VARCHAR(50), IN new_offset INT)
BEGIN
	-- 변수 선언
	DECLARE lower_keyword VARCHAR(50);
    DECLARE new_offset INTEGER;

	-- 전달 받은 키워드를 소문자로 변환
    SET lower_keyword = LOWER(keyword);
    
	SELECT * FROM productList
	WHERE isSold != 1 AND
		(LOWER(product_name) LIKE CONCAT('%', lower_keyword, '%')
		OR LOWER(nickname) LIKE CONCAT('%', lower_keyword, '%')
        OR (lower_keyword REGEXP '^[0-9]+

```sql
-- 시작점을 0으로 설정하고, 특정 키워드를 포함하는 데이터를 출력
CALL test_search('test_expression', 0)

--- AND CAST(lower_keyword AS UNSIGNED) = productId))
LIMIT 50 OFFSET new_offset;
END//
DELIMITER ;


{{CODE_BLOCK_4}}

---