database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41043 게시물 읽기
No. 41043
PL/SQL Exception 관련.
작성자
JHetfield
작성일
2016-01-04 15:28
조회수
9,241

안녕하세요.

 

회사의 운영업무가 다소 많은 관계로 PL/SQL 개발을 하고 있습니다.

 

헌데, SELECT 절에서 리턴된 데이터가 존재하지 않을시 EXCEPTION 영역으로 빠져버려서

 

BEGIN 안에 있는 INSERT, UPDATE, DELETE등 DML 작업을 수행하지 않는데, 만약 하나의 SELECT 절에서

 

리턴된 데이터가 없더라도 BEGIN안에 있는 DML문장을 수행할 수 있는 방법은 없을까요??

 

BEGIN안에 SELECT된 조건으로 수행여부가 IF문으로 정의는 되어 있습니다.

 

 

[예제]

create or replace procedure PROC_EMP_DropEMP(EMPID IN VARCHAR2)

is

각종 변수선언

begin

select 문장1;

select 문장2;

select 문장3;

 

문장1의 조건문 실행

INSERT, UPDATE, DELETE

 

문장2의 조건문 실행

INSERT, UPDATE, DELETE

 

문장3의 조건문 실행

INSERT, UPDATE, DELETE

 

EXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('예외발생');

 

ROLLBACK;

 

end;

 

이 글에 대한 댓글이 총 6건 있습니다.

[예제]
CREATE OR REPLACE PROCEDURE proc_emp_dropemp(empid IN VARCHAR2)
IS
    각종 변수선언
BEGIN
    BEGIN
        SELECT 문장1;
        문장1의 조건문 실행
        INSERT, UPDATE, DELETE
    EXCEPTION
        문장1의 예외문 실행
    END;
    BEGIN
        SELECT 문장2;
        문장2의 조건문 실행
        INSERT, UPDATE, DELETE
    EXCEPTION
        문장2의 예외문 실행
    END;
    BEGIN
        SELECT 문장3;
        문장3의 조건문 실행
        INSERT, UPDATE, DELETE
    EXCEPTION
        문장3의 예외문 실행
    END;
EXCEPTION
    전체프로시져의 예외문 실행
END;

 

마농(manon94)님이 2016-01-04 17:01에 작성한 댓글입니다.
이 댓글은 2016-01-05 11:43에 마지막으로 수정되었습니다.

마농님~~ 감사합니다.

 

역시 최고이십니다. ㅎㅎ 문의한 내용에 대한 완벽한 결과~~ ㅋㅋ

 

많이 배우고 갑니다~~

JHetfield님이 2016-01-05 10:18에 작성한 댓글입니다. Edit

마농님!! 질문 하나만 더 하겠습니다.

 

만약 BEGIN ~ END 블럭이 3개가 있고, 첫번째 BEGIN ~ END 블럭에서 Select된

 

결과가 있어서 DML 작업을 수행하고, 두번째 BEGIN ~ END 블럭에서 Select된

 

결과가 없었을때 Exception으로 빠져서 Exception 결과물을 화면에 찍고, 세번째

 

BEGIN ~ END 블럭을 수행해야 하나 마지막 BEGIN ~ END 블럭을 수행하지 못하고

 

있는데... 이것은 어떻게 해야하는지요??

JHetfield님이 2016-01-05 14:28에 작성한 댓글입니다. Edit

디버깅 해보셔야죠.
어느부분에서 에러가 나는지? 에러의 원인이 뭔지?
마지막 부분이 수행이 안된다면 그 이전에 에러가 났다는 거겠죠.

마농(manon94)님이 2016-01-05 15:00에 작성한 댓글입니다.

Beta 테스트로 여러번 디버깅을 해보았는데, 첫번째 Block을 정상적으로 수행하고 두번째 블럭에서 Exception내용을 화면에 보여주고 계속 멈추네요 ㅠ.ㅠ 정상적으로 컴파일은 되는거 보니 쿼리상에는 문제가 없어 보이기는 하지만... Cursor를 이용해야 하는걸까요??

 

개발된 소스 첨부하겠습니다. 뭐가 문제인지 쪽집게 처럼 짚어 주시면 감사하겠습니다. 꾸벅^^

 

CREATE OR REPLACE PROCEDURE PROC_EMP_DropEMP(

EMPID IN VARCHAR2

)

IS

 

PRV_EXIST_EMPID_CNT NUMBER := 0;

PRV_MAIL_EMPID VARCHAR2(12) := '';

PRV_MAIL_AUTHCNT NUMBER := 0;

PRV_MAIL_CFGCNT NUMBER := 0;

PRV_SMAT_AUTHCNT NUMBER := 0;

 

BEGIN

 

BEGIN

SELECT NVL(COUNT(*), 0) CNT INTO PRV_EXIST_EMPID_CNT

FROM LIMSDB.USER_INFO

WHERE USER_ID = EMPID;

 

IF PRV_EXIST_EMPID_CNT > 0 THEN

 

UPDATE LIMSDB.USER_INFO SET CONFIRM_FLAG = '0'

, COLLEGE = NULL

, SUBJECT = '퇴사'

, UPDATE_DATE = SYSDATE

, UPDATE_USER_ID = 'admin'

, CELL_PHONE = NULL

WHERE USER_ID = EMPID;

 

UPDATE LIMSDB.USER_INFO_TEMP SET COLLEGE = NULL

, SUBJECT = '퇴사'

, CELL_PHONE = NULL

, ENC_CELL_PHONE = NULL

WHERE USER_ID = EMPID;

 

COMMIT;

 

DBMS_OUTPUT.PUT_LINE('내부 임직원 퇴사처리 완료<' || EMPID || '>');

 

END IF;

 

EXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('★NO_DATA_FOUND 예외 발생');

DBMS_OUTPUT.PUT_LINE('- LIMSDB.USER_INFO (' || EMPID || ')인 행이 존재하지 않습니다.');

 

END;

 

 

BEGIN

SELECT EMP_ID

, MAIL_AUTH_CNT

, MAIL_CFG_CNT INTO PRV_MAIL_EMPID, PRV_MAIL_AUTHCNT, PRV_MAIL_CFGCNT

FROM

(

SELECT A.EMP_ID EMP_ID

,

(

SELECT COUNT(*)

FROM MAILDB.EMP_AUTH X

WHERE X.EMP_ID = A.EMP_ID

) MAIL_AUTH_CNT

,

(

SELECT COUNT(*)

FROM MAILDB.EMP_CONFIG X

WHERE X.EMP_ID = A.EMP_ID

) MAIL_CFG_CNT

FROM MAILDB.EMP A

WHERE A.EMP_ID = EMPID

);

 

IF PRV_MAIL_EMPID IS NOT NULL OR PRV_MAIL_AUTHCNT > 0 OR PRV_MAIL_CFGCNT > 0 THEN

 

IF PRV_MAIL_EMPID IS NOT NULL THEN

 

UPDATE MAILDB.EMP SET EMP_DEPT = '퇴사'

, CONFIRM_FLAG = '0'

, EMP_INFO = NULL

, UPDATE_DATE = SYSDATE

, REV_FLAG = '0'

WHERE EMP_ID = EMPID;

 

ELSIF PRV_MAIL_AUTHCNT > 0 THEN

 

DELETE FROM MAILDB.EMP_AUTH

WHERE EMP_ID = EMPID;

 

ELSIF PRV_MAIL_CFGCNT > 0 THEN

 

DELETE FROM MAILDB.EMP_CONFIG

WHERE EMP_ID = EMPID;

 

END IF;

 

COMMIT;

 

DBMS_OUTPUT.PUT_LINE('MAILDB 내부 임직원 퇴사처리 완료<' || EMPID || '>');

 

END IF;

 

EXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('★NO_DATA_FOUND 예외 발생');

DBMS_OUTPUT.PUT_LINE('- MAILDB.EMP (' || EMPID || ')인 행이 존재하지 않습니다.');

 

END;

 

 

BEGIN

SELECT NVL(COUNT(*), 0) CNT INTO PRV_SMAT_AUTHCNT

FROM SMATDB.SMAT_AUTH

WHERE USER_ID = EMPID;

 

IF PRV_SMAT_AUTHCNT > 0 THEN

 

DELETE FROM SMATDB.SMAT_AUTH

WHERE USER_ID = EMPID;

 

COMMIT;

 

DBMS_OUTPUT.PUT_LINE('SMATDB 내부 임직원 퇴사처리 완료<' || EMPID || '>');

 

END IF;

 

EXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('★NO_DATA_FOUND 예외 발생');

DBMS_OUTPUT.PUT_LINE('- SMATDB.SMAT_AUTH (' || EMPID || ')인 행이 존재하지 않습니다.');

END;

 

EXCEPTION WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('★정의되지 않은 예외 발생');

ROLLBACK;

 

END PROC_EMP_DropEMP;

 

 

EXEC PROC_EMP_DropEMP('hwanseok');

JHetfield님이 2016-01-05 17:21에 작성한 댓글입니다.
이 댓글은 2016-01-05 17:26에 마지막으로 수정되었습니다. Edit

멈춘다는 표현의 정확한 의미가???
  - 멈춘 상태 그대로 대기상태라는 것인지?
  - 3번째 동작을 안하고 정상적으로 끝났다는 것인지?


대기 상태라면?
 - LOCK 을 의심해야 할 거구요.
정상 종료되었다면?
  3번 작업 도중 오류가 발생했을 거구요.
  3번 예외절에서는 no_data_found 만 잡고 있네요.
  When Others 를 추가해서 점검해 보세요.


    WHEN OTHERS THEN
        dbms_output.put_line('Step3(' || SQLCODE || ')' || SQLERRM);

마농(manon94)님이 2016-01-07 10:18에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41046쿼리문안에 INTO이건 어떨때 쓰나요? [2]
seung
2016-01-07
8283
41045테이블, 뷰의 속성 조회 [3]
정재봉
2016-01-06
8511
41044시간별 합산하려고 하는데요. [4]
mayse
2016-01-05
8263
41043PL/SQL Exception 관련. [6]
JHetfield
2016-01-04
9241
41041데이터를 1년 전체 표로 표현하기 [1]
김형우
2015-12-28
8608
41039쉼표로 옆으로 표현된 데이타를 세로로 표현하기 [1]
정재영
2015-12-24
8637
41038한 row로 쿼리 추출 방법? [1]
strider
2015-12-23
8613
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다