문제/SQL

231101 PL/SQL 복습 겸 문제

잇꼬 2023. 11. 1. 10:45
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