- 기본형
CREATE PROCEDURE procedure_name(parameter1 datatype, parameter2 datatype)
LANGUAGE plpgsql
AS $$
BEGIN
END;
$$;
- 변수 선언 및 입력 파라미터, 출력 파라미터 사용
CREATE OR REPLACE PROCEDURE update_seq(IN input_id integer, IN new_seq integer, OUT result boolean)
LANGUAGE plpgsql
AS $$
DECLARE
old_seq integer;
BEGIN
SELECT seq
INTO old_seq
FROM products
WHERE id = input_id;
RAISE NOTICE 'Sequence updated successfully.';
result := true;
RETURN;
END;
$$
;
- 성공 시 출력 파라미터의 결과 result에 true를 담아서 종료한다
- 예외 처리 및 테이블명을 동적으로 처리
CREATE OR REPLACE PROCEDURE update_seq(IN input_id integer, IN new_seq integer, IN table_name text, OUT result boolean)
LANGUAGE plpgsql
AS $$
DECLARE
old_seq integer;
max_seq integer;
BEGIN
EXECUTE 'SELECT seq FROM ' || quote_ident(table_name) || ' WHERE id = $1' INTO old_seq USING input_id;
RAISE NOTICE 'Sequence updated successfully.';
result := true;
EXCEPTION
WHEN OTHERS THEN
result := false;
ROLLBACK;
RETURN;
END;
$$
;
- 입력 파라미터 table_name을 프로시저 내에서 처리하기 위해 EXECUTE USING 문으로 처리
- 프로시저 실행 시 예외가 발생했을 때 출력 파라미터 결과 result에 false를 담고 종료
- 데이터 시퀀스를 변경하는 프로시저 예시
CREATE OR REPLACE PROCEDURE update_seq(IN input_id integer, IN new_seq integer, IN table_name text, OUT result boolean)
LANGUAGE plpgsql
AS $$
DECLARE
old_seq integer;
max_seq integer;
BEGIN
EXECUTE 'SELECT seq FROM ' || quote_ident(table_name) || ' WHERE id = $1' INTO old_seq USING input_id;
EXECUTE 'SELECT MAX(seq) FROM ' || quote_ident(table_name) INTO max_seq;
IF new_seq < 1 OR new_seq > max_seq THEN
RAISE EXCEPTION 'Invalid sequence value: %', new_seq;
END IF;
IF new_seq < old_seq THEN
EXECUTE 'UPDATE ' || quote_ident(table_name) || ' SET seq = seq + 1 WHERE seq BETWEEN $1 AND $2' USING new_seq, old_seq - 1;
ELSE
EXECUTE 'UPDATE ' || quote_ident(table_name) || ' SET seq = seq - 1 WHERE seq BETWEEN $1 + 1 AND $2' USING old_seq, new_seq;
END IF;
EXECUTE 'UPDATE ' || quote_ident(table_name) || ' SET seq = $1 WHERE id = $2' USING new_seq, input_id;
RAISE NOTICE 'Sequence updated successfully.';
result := true;
EXCEPTION
WHEN OTHERS THEN
result := false;
ROLLBACK;
RETURN;
END;
$$
;
- 프로시저 호출
CALL procedure_name(1, 2, 'users', result);