본문 바로가기

개인공부 정리/문제풀이

0210 오라클 DB 문제풀이 - 커서와 예외처리, 트리거

1. 문제 1 (478P) 

Q1)

1) 

--1) 내가 한 것
DECLARE 
V_EMP_ROW EMP%ROWTYPE;
CURSOR c1 IS
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP;

BEGIN 
OPEN c1 ;
LOOP
FETCH c1 INTO V_EMP_ROW;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE 
('EMPNO  : ' || V_EMP_ROW.EMPNO ||
'ENAME : ' || V_EMP_ROW.ENAME ||
'JOB : ' || V_EMP_ROW.JOB ||
'SAL : ' ||V_EMP_ROW.SAL ||
'DEPTNO : ' || V_EMP_ROW.DEPTNO  );

END LOOP;
CLOSE C1;


END; 
/

오류

--1) 정답
--SELECT 문이 이상했음
DECLARE 
V_EMP_ROW EMP%ROWTYPE;
CURSOR c1 IS
SELECT * FROM EMP;

BEGIN 
OPEN c1 ;
LOOP
FETCH c1 INTO V_EMP_ROW;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE 
(' EMPNO  : ' || V_EMP_ROW.EMPNO ||
' ENAME : ' || V_EMP_ROW.ENAME ||
' JOB : ' || V_EMP_ROW.JOB ||
' SAL : ' ||V_EMP_ROW.SAL ||
' DEPTNO : ' || V_EMP_ROW.DEPTNO  );

END LOOP;
CLOSE C1;


END; 
/

SELECT 문을 바꾼 결과

 

2) 

--2) FOR LOOP 방식
--SELECT * FROM 을 입력안한 것이 실수
--FOR LOOP는 LOOP가 자동으로 입력이 되기 때문에 굳이 OPEN 문 안해도 됨
--애초에 생략하기 위해 쓴 것이기에

DECLARE 
CURSOR c1 IS
SELECT * FROM EMP;

BEGIN 

FOR c1_rec IN c1 LOOP
DBMS_OUTPUT.PUT_LINE 
(' EMPNO  : ' || c1_rec.EMPNO ||
' ENAME : ' || c1_rec.ENAME ||
' JOB : ' || c1_rec.JOB ||
' SAL : ' ||c1_rec.SAL ||
' DEPTNO : ' || c1_rec.DEPTNO  );

END LOOP;


END; 
/

같은 결과값이지만 FOR LOOP가 자동 LOOP를 해주기 때문에 줄어들었다.

Q2)

--날짜 표기법은 날짜를 문자형태로 바꾸는 형식이 필요함
--TO_CHAR가 왜 필요한가
DECLARE 
 v_wrong DATE;
BEGIN 
SELECT ENAME INTO v_wrong
FROM EMP
WHERE EMPNO = 7369;
DBMS_OUTPUT.PUT_LINE ('예외가 발생하면 다음 문장은 실행되지 않습니다');

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('오류가 발생하였습니다.'|| TO_CHAR(SYSDATE, '[""YYYY"년"MM"월"DD"일" HH24"시"MI"분"SS"초"]'));
DBMS_OUTPUT.PUT_LINE ('SQLCODE : ' || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE ('SQLERRM : ' || SQLERRM );

END; 
/

날짜 입력은 자세하게 써야하는 부분

 

728x90
반응형
LIST