728x90
반응형
SMALL
[문제] 사원들 중에 job_id가 'SA_REP' 사원들의 이름, 부서 이름을 출력하고 부서 배치를 받지 않는 사원에 대해서는 "부서 배치를 못 받았습니다." 출력해야 합니다. 또한 출력할때 카운터 수를 출력해주세요.(조인은 이용하지 마세요)
HIT) SELECT문, 서브블록, 반복문, 로드, 암시적커서-예외처리
내가 쓴 코드)
DECLARE
e_raise EXCEPTION; -- 예외사항 변수
job hr.employees.job_id%TYPE;
BEGIN
FOR emp_rec IN ( SELECT last_name FROM hr.employees WHERE job_id = 'SA_REP') LOOP
dbms_output.put_line('사원이름 : '||emp_rec.last_name);
END LOOP;
/* 서브 블록 */
BEGIN
IF job = 'SA_REP' THEN
FOR dept_rec IN ( SELECT department_name FROM hr.departments ) LOOP
dbms_output.put_line('부서이름 : '||dept_rec.department_name);
END LOOP;
RAISE e_raise;
END IF;
EXCEPTION
WHEN e_raise THEN
dbms_output.put_line('부서 배치를 못받았습니다.');
END;
END;
/
정답)
DECLARE
CURSOR emp_cursor IS
SELECT last_name, department_id
FROM hr.employees
WHERE job_id = 'SA_REP';
v_rec emp_cursor%ROWTYPE;
v_dept_name VARCHAR2(30); -- department_name 변수
v_cnt NUMBER := 1; --COUNT 변수 및 초기값 설정
BEGIN
OPEN emp_cursor; -- 메모리 할당
LOOP
FETCH emp_cursor INTO v_rec;
EXIT WHEN emp_cursor%NOTFOUND; -- 무한반복문을 빠져나오기 위한 exit
/* sub block */
BEGIN
SELECT department_name
INTO v_dept_name
FROM hr.departments
WHERE department_id = v_rec.department_id;
dbms_output.put_line(v_cnt||' 사원이름 : '||v_rec.last_name||', 부서이름 : '||v_dept_name);
v_cnt := v_cnt+1; -- count 함수 증가
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(v_cnt||' 사원이름 : '||v_rec.last_name||', 부서이름 : 부서 배치를 못 받았습니다.');
v_cnt := v_cnt+1; -- count 함수 증가
END;
/* END sub block */
END LOOP;
CLOSE emp_cursor;
END;
/
728x90
반응형
LIST
'문제 > SQL' 카테고리의 다른 글
231103 PL/SQL 복습 겸 문제 (0) | 2023.11.06 |
---|---|
231102 PL/SQL 문제 (0) | 2023.11.02 |
231031 PL/SQL 문제 (0) | 2023.10.31 |
231031 복습 겸 문제 (1) | 2023.10.31 |
231031 PL/SQL 복습 겸 문제 (1) | 2023.10.31 |