SQL%FOUND/NOFOUND
예외처리 하기 전
입력된 값이 있을 때나 입력에 성공했을 때 확인 할 수 있게 입력 해 두는 장치임!!
SQL%FOUND 는 입력된 값이 있을 때 TRUE를 반환
SQL%NOTFOUND 는 입력된 값이 없을 때 TURE를 반환
SQL%ROWCOUNT 는 가장 최근의 SQL문장에 의해 영향을 받은 행의 수 레코드가 생성된 수!!
++
%TYPE : 테이블에 값을 넣으려고 하는데 타입을 알 수 없을 때 예약어 사용하면 맞출 수 있음! 여기서 부터 예외처리의 필요성이 시작된걸까,,,?
출력문에 사용불가:
DBMS_OUTPUT.PUT_LINE(SQL%FOUND); 조건문에 사용한다!
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' 개 레코드가 입력 되었습니다'); 요거 사용은 O
[사용자에 입력받아 테이블에 값 넣기]
방법1. 예외의 종류 한번에 잡기 , 잡기는 간단하나 세분화해서 알 수는 없다
ACCEPT id PROMPT '아이디 입력?'
ACCEPT title PROMPT '제목 입력?'
DECLARE
id bbs.id%TYPE ; -- := '&id'; -- 예약어 사용하면 타입 바로 맞출 수 있음 id VARCHAR2(10) := &id와 같음!!
title bbs.title%TYPE ; -- := '&title'; 예외 안잡으려면 걍 이거 사용 아니면.... 타입자체를 늘려놔야해
BEGIN 실행부안에서 에러가 나면 EXCEPTION 안으로 바로 들어옴!!!
id :='&id'; ---- 선언부의 예외를 못잡아서 초기화를 여기서 하면 예외를 잡을 수 있다!
title := '&title';
INSERT INTO bbs VALUES(SEQ_BBS.NEXTVAL,title,id,SYSDATE);
IF SQL%FOUND THEN -------입력된 값이 있을 때! 입력에 성공 했을 때
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || 'ROW AFFECTED');
COMMIT; -- 실제 테이블에 저장 하는 기능!!
END IF;
EXCEPTION -- 예외처리!!! 하기 근데 선언부에서 발생하는 예외는 못잡는다...
WHEN OTHERS THEN -- 이게 자바에서 부모예외(?) 같은거! 웬만한거 다 잡는데!
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('오류발생!! No가 중복되거나 입력하신 아이디 혹은 제목이 너무 길어용'); --||SQLERRM); SQLERRM 는 E.MESSEGE 같은거
END;
/
방법2.예외를 세분화 하기! 어디서 뭐가 잘못 된건지 알 수 있으나... 코딩이 복잡하다 ...ㅎ
ACCEPT id PROMPT 'Input username?'
ACCEPT title PROMPT 'Input title?'
DECLARE
id VARCHAR2(1000):= '&id';
title NVARCHAR2(1000) := '&title'; 애초에 자료형의 길이보다 많은 데이타로 설정
BEGIN
IF LENGTH(title) > 10 OR LENGTH(id) > 10 THEN
DBMS_OUTPUT.PUT_LINE('TITLE OR ID IS MORE THAN 10'); 길이 안맞는거 먼저 걸러 냄!
ELSE
INSERT INTO bbs VALUES(SEQ_BBS.NEXTVAL,title,id,SYSDATE);
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || 'ROW AFFECTED');
COMMIT;
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN 다른예외 걸러냄
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('PK IS DUPLICATE'); PK중복인경우
END;
/


++ 예외처리 구문
BEGIN
EXCEPTION
BEGIN
예외처리들
END;
END;
요렇게 넣어도 가능하대요
EXCEPTION
PL/SQL문 안에서 SELECT문을 쓸 때는 반드시 INTO절과 사용한다.
그리고 반드시 레코드 하나만 검색되는 SELECT문만 가능
[검색할 때 발생하는 오류 잡기]
ACCEPT NO PROMPT '글 번호를 입력하세요'
ACCEPT TITLE PROMPT'제목을 입력하세요'
DECLARE
--- 레코드가 없는 경우 테스트
no_ bbs.no%TYPE :=&no;
title_ bbs.title%TYPE;
id_ bbs.id%TYPE;
postdate_ bbs.postdate%TYPE;
val NUMBER; -->OTHERS 테스트용
BEGIN
-- 레코드 없는경우용
/*SELECT title, id, postdate INTO title_, id_, postdate_ FROM bbs
WHERE no=no_;*/
-- 여러 레코드
SELECT title, id, postdate INTO title_, id_, postdate_ FROM bbs
WHERE title like '&title%' ;
dbms_output.put_line(title_||':'||id_||':'||postdate_);
VAL := 100/0 ; -- OTHERS용 걍 이건 무조건 에러나게 만든거
exception
when NO_DATA_FOUND then
dbms_output.put_line(no_||'로 입력된 글번호가 없어요');
when TOO_MANY_ROWS THEN
dbms_output.put_line('두 개 이상의 레코드들이 존재함 ');
when OTHERS THEN
dbms_output.put_line('ERROR NO:'|| SQLCODE);
dbms_output.put_line('ERROR MESSAGE'|| SQLERRM);
END;
/



[예외 종류]
1.REDEFINED EXCEPTION : ORACLE Server 에러 중 자주 발생되는 20가지 에러에 대해 미리 정의되어 있는 EXCEPTION ,, 에러명 에러번호 가 있음
2. NON-PREDEFINED EXCEPTION :사전에 정의된게없는 오류들.... 그치만 에러번호는 있는 오류들 진짜 오류들
EX)
DECLARE
exception명 EXCEPTION;
PRAGMA EXCEPTION_INIT(exception명, 에러번호); -> 에러번호 있음
BEGIN
. . .
EXCEPTION
WHEN exception명 THEN
. . .
END;
3. USER DEFINE EXCEPTION :이게 사용자가 만든 예외 자바에서 만들었던게 이런거!
EX)
DECLARE
exception명 EXCEPTION; ->에러번호가 없지
BEGIN
RAISE exception명 ;
. . .
EXCEPTION
WHEN exception명 THEN
. . .
END;
4. SQLCODE, SQLERRM : 저장되어있는 에러 메세지 출력용
일반적인 Error 처리를 위하여 Oracle에서 제공하는 함수
SQLCODE: ORACLE에서 지정된 Error Code를 숫자로 Return (0:success)
SQLERRM: ORACLE에서 지정된 Error Code에 해당하는 Error Message를 Return
'학원 > DB(오라클),SQL문' 카테고리의 다른 글
10/20 25-2 트랜젝션.. (0) | 2022.10.20 |
---|---|
10/20 25-1 사용자 정의 예외 (0) | 2022.10.20 |
10/19 24-3 [PL/SQL]반복문 WHILE/LOOP 문 (0) | 2022.10.19 |
10/19 24-2 [PL/SQL]FOR문 (0) | 2022.10.19 |
10/19 24-1 [PL/SQL] IF문 (0) | 2022.10.19 |