Notice
Recent Posts
Recent Comments
Link
투케이2K
142. (Oracle/오라클) 프로시저 (procedure) - 데이터 삽입 insert , 수정 update 및 트랜잭션 commit 수행 실시 본문
OracleDB
142. (Oracle/오라클) 프로시저 (procedure) - 데이터 삽입 insert , 수정 update 및 트랜잭션 commit 수행 실시
투케이2K 2021. 8. 17. 08:28[개발 환경 설정]
개발 툴 : Toad
개발 언어 : Oracle
[소스 코드]
CREATE OR REPLACE PROCEDURE TEST_INSERT_DEPT_PROCEDURE (
I_IDX IN VARCHAR,
I_NAME IN VARCHAR,
I_PHONE IN VARCHAR,
I_PLACE IN VARCHAR,
O_MSG OUT VARCHAR,
O_CURSOR OUT SYS_REFCURSOR
)
/***************************************************************
[설 명]
특정 부서 목록 추가 INSERT, UPDATE 수행 실시
---------------------------------------------------------------
[생성]
edit 창에서 F9를 눌러서 쿼리 실행 시 자동 생성된다
---------------------------------------------------------------
[IN 인풋 데이터]
I_IDX - 인덱스 순번
I_NAME - 부서 이름
I_PHONE - 부서 연락처
I_PLACE - 부서 위치
---------------------------------------------------------------
[OUT 리턴 데이터]
O_MSG - 반환 결과 메시지
O_CURSOR - 반환 커서 데이터 (테이블)
---------------------------------------------------------------
[프로시져 호출]
EXEC TEST_INSERT_DEPT_PROCEDURE('15', '생산부', '070-123-4567', 'P-15', :AA,:BB);
---------------------------------------------------------------
[프로시져 결과]
Y : MESSAGE
N : MESSAGE
CURSOR : TABLE DATA
---------------------------------------------------------------
[프로시져 삭제]
DROP PROCEDURE TEST_INSERT_DEPT_PROCEDURE;
****************************************************************/
--AS --선택
IS --선택
/******************[전역변수 생성 및 초기화]********************/
M_IDX VARCHAR2 (50);
M_NAME VARCHAR2 (50);
M_PHONE VARCHAR2 (50);
M_PLACE VARCHAR2 (50);
M_DEBUG INTEGER;
M_COUNT VARCHAR2 (50);
/*****************[메인부분 시작 및 커서생성]*******************/
BEGIN
/*==========[변수값 대입 실시]==========*/
M_IDX := I_IDX; -- 인풋 데이터 삽입
M_NAME := I_NAME; -- 인풋 데이터 삽입
M_PHONE := I_PHONE; -- 인풋 데이터 삽입
M_PLACE := I_PLACE; -- 인풋 데이터 삽입
/*=========[데이터 널 검증 실시]=========*/
M_DEBUG := 1; -- 디버깅 단계 지정
IF M_IDX IS NULL OR M_IDX = ''
OR M_NAME IS NULL
OR M_NAME = ''
OR M_PHONE IS NULL
OR M_PHONE = ''
OR M_PLACE IS NULL
OR M_PLACE = ''
THEN
BEGIN
O_MSG := 'N : ' || 'M_DEPT IS NULL' || ' [M_DEBUG := '|| M_DEBUG ||']'; -- 리턴 메시지 삽입
OPEN O_CURSOR FOR SELECT '' AS "DATA_TABLE" FROM DUAL; -- 리턴 커서 호출
END;
RETURN; -- 프로시져 종료
END IF;
/*==[인덱스 확인 및 insert, update 판단]==*/
M_DEBUG := 2; -- 디버깅 단계 지정
-- 인풋으로 들어온 IDX 값이 기존에 저장된 값인지 확인 후 M_COUNT 변수에 COUNT 값을 담음
SELECT COUNT(T_DEPT_IDX) INTO M_COUNT
FROM TEST_DEPT
WHERE TRIM(T_DEPT_IDX) = TRIM(M_IDX);
DBMS_OUTPUT.PUT_LINE('==================');
DBMS_OUTPUT.PUT_LINE('[TEST_INSERT_DEPT_PROCEDURE] : ' || '[M_COUNT] : ' || M_COUNT);
DBMS_OUTPUT.PUT_LINE('==================');
/*==[기존에 IDX 값이 있으면 UPDATE, 없으면 INSERT]==*/
M_DEBUG := 3; -- 디버깅 단계 지정
CASE WHEN M_COUNT IS NULL OR M_COUNT = '' OR M_COUNT = 0 -- 널 값일 경우
THEN
DBMS_OUTPUT.PUT_LINE('==================');
DBMS_OUTPUT.PUT_LINE('[TEST_INSERT_DEPT_PROCEDURE] : ' || '[INSERT]');
DBMS_OUTPUT.PUT_LINE('==================');
INSERT INTO TEST_DEPT
(T_DEPT_IDX, T_DEPT_NAME, T_DEPT_PHONE, T_DEPT_PLACE) -- 테이블 컬럼 지정
VALUES
(M_IDX, M_NAME, M_PHONE, M_PLACE);
ELSE
DBMS_OUTPUT.PUT_LINE('==================');
DBMS_OUTPUT.PUT_LINE('[TEST_INSERT_DEPT_PROCEDURE] : ' || '[UPDATE]');
DBMS_OUTPUT.PUT_LINE('==================');
UPDATE TEST_DEPT
SET
T_DEPT_IDX = M_IDX, -- 부서 인덱스
T_DEPT_NAME = M_NAME, -- 부서 이름
T_DEPT_PHONE = M_PHONE, -- 부서 연락처
T_DEPT_PLACE = M_PLACE -- 부서 장소
WHERE
T_DEPT_IDX = M_IDX; -- 조건
END CASE;
/*======[커서 생성 및 반환 쿼리 실행]======*/
M_DEBUG := 4; -- 디버깅 단계 지정
OPEN O_CURSOR FOR
SELECT *
FROM TEST_DEPT;
/*===========[프로시저 종료]============*/
M_DEBUG := 5; -- 디버깅 단계 지정
COMMIT; -- INSERT , UPDATE 최종 완료 후 트랜잭션 커밋 수행 실시
O_MSG := 'Y : SUCCESS'; -- 리턴 메시지 삽입
--RETURN; -- 프로시저 종료
/*==========[예외 발생 메시지 리턴]=========*/
EXCEPTION
WHEN NO_DATA_FOUND
THEN
BEGIN
O_MSG := 'N : ' || 'EXCEPTION' || ' [NO_DATA_FOUND]';
OPEN O_CURSOR FOR SELECT '' AS "DATA_TABLE" FROM DUAL;
END;
WHEN OTHERS
THEN
BEGIN
O_MSG := 'N : ' || 'EXCEPTION' || ' [M_DEBUG := '|| M_DEBUG ||']';
OPEN O_CURSOR FOR SELECT '' AS "DATA_TABLE" FROM DUAL;
END;
/*******************[프로시저 종료 완료 부분]********************/
END TEST_INSERT_DEPT_PROCEDURE;
/
[결과 출력]
반응형
'OracleDB' 카테고리의 다른 글
Comments