안녕하세요 postgresql 입문자 입니다.
오라클 pl/sql을 plpgsql로 변환 중 트랜젝션이 상이 하여 헤메고 있습니다 고수님들의 도움을 요청 드립니다.
아래 소스는 단순 인서트후 커밋하는 프로시져이며 단계별 함수를 호출하여 로그를 기록하는 로직입니다.
프로시져 및 함수에서의 commit을 제거 후 실행 하면 수행 완료 후 자동커밋으로 수행이 되지만 별도 트랜젝션 관리가 필요 할거 같아 문의 드립니다.
1. 함수내에서의 commit 처리가 가능한지?
=> 함수내의 commit이 존재한 상태에서의 수행은 에러 { 오류: 잘못된 트랜잭션 마침. 구문: PL/pgSQL 함수 "fn_test(double precision,character varying)" 의 50번째 COMMIT
2. 프로시져내에서의 함수 및 프로시져 호출 후 commit 수행 방법
=> 프로시져내에서만 commit 존재 상태에서의 수행은 에러 { 알림: ORACLE ERROR : [ 2D000] :하위트랜잭션이 활성화 된 상태에서는 커밋 할 수 없음 }
3. 아래 소스 방안 외 해당 로직을 수행 할수 있는 방안
=> 아래 로직을 수행할수 있는 더 좋은 방안이 있나요??
--------------------------------------------------------------------------------------------------------------------------
--함수
--------------------------------------------------------------------------------------------------------------------------
create or replace FUNCTION FN_TEST (
IN_ID DOUBLE PRECISION DEFAULT 0,
IN_REMARKS VARCHAR DEFAULT NULL
) RETURNS DOUBLE PRECISION
as $$
DECLARE
V_PATH VARCHAR(100) = 'TEST';
BEGIN
V_ID = IN_ID;
IF V_ID = 0 THEN
-- 시작 LOG
SELECT nextval('SEQUENCE') INTO V_ID;
INSERT INTO TB_LOG (
...
ELSE
-- 종료 LOG
UPDATE TB_LOG SET END_DATE = now(),
...
END IF;
COMMIT;
RETURN V_ID;
end $$
language plpgsql;
--------------------------------------------------------------------------------------------------------------------------
--프로시져
--------------------------------------------------------------------------------------------------------------------------
create or replace procedure SP_TEST()
as $$
DECLARE
V_MSG VARCHAR(2000);
V_ID DOUBLE PRECISION = 0;
BEGIN
-- 시작 로그
V_ID = FN_TEST(0, '시작');
EXECUTE 'TRUNCATE TABLE TB_TABLE';
INSERT /*+ APPEND */ INTO TB_TABLE (
...
COMMIT;
-- 종료 로그
V_ID = FN_TEST(V_ID, '성공');
EXCEPTION
WHEN OTHERS THEN
V_MSG := 'ORACLE ERROR : [ ' || SQLSTATE || '] :' || SQLERRM;
RAISE NOTICE '%', V_MSG;
ROLLBACK;
-- 에러 로그
V_ID = FN_TEST(V_ID, '!예외 - ' || V_MSG);
end $$
language plpgsql;
|