반응형
PL/SQL 블록 구조
DECLARE
-- 선언부(옵션)
-- 변수나 상수를 정의
BEGIN
-- 실행부(필수, BEGIN-END)
-- 로직 수행(일반 SQL문, 조건문, 반복문 등)
EXCEPTION
-- 예외처리부(옵션)
-- 로직 수행중 에러 발생 시 예외 사항 처리
END;
오라클 PL/SQL 작성시 기본 구문정리, 프로시저등을 바로 생성하지 않고 다음과 같이 테스트 후 생성하면 된다.
DECLARE
M_NAME VARCHAR2(50) := '투케이'; --초기 변수 선언
--특정테이블의 컬럼타입을 변수에 지정하기.
--V_ENAME 테이블명.컬럼명%TYPE;
OUT_MSG VARCHAR2(50);
NUM NUMBER:=11;
v_num NUMBER:=0;
-- 사용자정의 EXCEPTION 선언
NUM_CHECKER EXCEPTION;
-- 커서 등록
CURSOR C_TMP1 IS
SELECT 'TEST1' AS COL FROM DUAL UNION ALL
SELECT 'TEST2' FROM DUAL UNION ALL
SELECT 'TEST3' FROM DUAL
;
BEGIN
DBMS_OUTPUT.PUT_LINE('=========초기변수값===============');
DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME); -- 결과 출력
DBMS_OUTPUT.PUT_LINE('=========변수에 값 직접대입===============');
M_NAME := 'xxx'; --변수에 값 대입 실시
DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME); -- 결과 출력
DBMS_OUTPUT.PUT_LINE('==========변수에 SELECT 값 대입===================');
SELECT '탈옥 투게더' AS s
INTO M_NAME
FROM dual;
DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME); -- 결과 출력
DBMS_OUTPUT.PUT_LINE('============LOOP문 과 EXIT(BREAK) =================');
LOOP
DBMS_OUTPUT.PUT_LINE('현재 숫자 : ' || v_num);
v_num := v_num + 1;
EXIT WHEN v_num > 3;
END LOOP;
DBMS_OUTPUT.PUT_LINE('============FOR LOOP문 과 EXIT(BREAK) =================');
FOR i in 1..10 LOOP
if mod(i, 2) = 0 then
dbms_output.put_line( i || '는 짝수!!');
else
dbms_output.put_line( i || '는 홀수!!');
end if;
EXIT WHEN i >= 4; --4이상이면 LOOP를 종료 시키다.
END LOOP;
DBMS_OUTPUT.PUT_LINE('==== DECLARE에 CURSOR 선언후 LOOP, 사용 후 반드시 커서를 CLOSE해야한다. ======');
FOR REC IN C_TMP1
LOOP
DBMS_OUTPUT.PUT_LINE(REC.COL);
END LOOP;
CLOSE C_TMP1; /* ★★★★ 커서는 반드시 CLOSE로 닫아줘야한다. ★★★★ */
DBMS_OUTPUT.PUT_LINE('=== DECLARE에 CURSOR 선언없이 안에서 LOOP, 이경우 묵시적으로 커서가 자동 CLOSE된다. ====');
FOR RECV_DTL IN (
SELECT 'TEST1' AS COL FROM DUAL UNION ALL
SELECT 'TEST2' FROM DUAL UNION ALL
SELECT 'TEST3' FROM DUAL
)
LOOP
DBMS_OUTPUT.PUT_LINE(RECV_DTL.COL);
END LOOP;
DBMS_OUTPUT.PUT_LINE('============EXCEPTION 처리=================');
NUM:=2;
BEGIN /* EXCEPTION 처리 구역 BEGIN ~ END 테스트용 */
IF NUM > 10 THEN -- EXCEPTION 조건 설정
DBMS_OUTPUT.PUT_LINE('EXCEPTION 호출');
RAISE NUM_CHECKER; -- EXCEPTION 호출 - NO2이 호출 됨
END IF;
DBMS_OUTPUT.PUT_LINE('NO1');
--RAISE NO_DATA_FOUND; -- NO_DATA_FOUND : 조회된 데이터가 없을때 나는 EXCEPTION 예약어 (EXCEPTION 호출 - NO3이 호출 됨)
--RAISE SELF_IS_NULL; -- OTHERS 확인용 호출 (EXCEPTION 호출 - NO7이 호출 됨)
-- 밑에 EXCEPTION에 없으면 계속 상위로 올라가면서 호출된다.
-- SELF_IS_NULL : 인스턴스가 초기화되지 않았을 경우 호출 되는 예약어
/* ★★★★ EXCEPTION 처리는 바로 상위 BEGIN END안에서 일어난 EXCEPTION 내에서 처리된다.
* 만약 해당 EXCEPTION 처리가 없으면 상위 BEGIN 으로 계속 이동 호출 함.
* EXCEPTION WHEN안에 구문을 블럭처리 할 수 없기때문에(??), EXCEPTION WHEN 이후 평소문을 쓸수 없음.
* 예외처리가 된 상위 BEGIN이 END가 끝나야 펑소문 사용가능. ★★★★ */
EXCEPTION
WHEN NUM_CHECKER THEN -- 사용자 정의 EXCEPTION
DBMS_OUTPUT.PUT_LINE('NO2');
OUT_MSG := '10이 넘어갑니다!';
RETURN; --RETURN:프로시저 종료, RETURN이 없을 경우 쿼리를 계속 수행함 (RETURN이없는 경우 NO5~~가 실행됨)
WHEN NO_DATA_FOUND THEN -- OHTER은 조건에 맞는 경우가 없을 경우
DBMS_OUTPUT.PUT_LINE('NO3');
OUT_MSG := 'OHTER 확인용!';
--RETURN; --RETURN:프로시저 종료, RETURN이 없을 경우 쿼리를 계속 수행함 (RETURN이없는 경우 NO4, NO5~~가 실행됨)
DBMS_OUTPUT.PUT_LINE('NO4');
END;
DBMS_OUTPUT.PUT_LINE('NO5');
OUT_MSG := '프로시저 수행 완료!';
DBMS_OUTPUT.PUT_LINE(OUT_MSG);
EXCEPTION
WHEN OTHERS THEN -- OHTER은 조건에 맞는 경우가 없을 경우
DBMS_OUTPUT.PUT_LINE('NO7');
END;
반응형
'IT > Oracle' 카테고리의 다른 글
오라클 프로시저 컴파일 오류 확인하는 법 (0) | 2023.07.26 |
---|---|
오라클 프로시저 생성 및 호출 IN, OUT 사용법 (0) | 2023.07.26 |
꼭알아야할 오라클 힌트절 7가지 (0) | 2022.07.22 |
DB 플랜 보는방법 및 기본적인 튜닝 방법 (0) | 2022.07.22 |
오라클 조인 방식 종류와 이해. (0) | 2022.07.22 |
댓글