SQL/연습문제 풀이

[SQL] 제어문 , 반복문

연정양 2023. 1. 17.

set serveroutput on;
begin
    dbms_output.put_line('안녕 PL/SQL');
END;

--스칼라 변수 선언하고 변수값 조회
set serveroutput on;
--선언
declare
    sonno number(4);
    sonname varchar2(12);
--실행문 시작
begin
    sonno := 1001;
    sonname := '홍길동';
    dbms_output.put_line('사번 이름');
    dbms_output.put_line('------------');
    dbms_output.put_line(''||sonno||''||sonname);
--실행문 종료 
end;

--pl/sql의 select문으로 emp테이블에서 사원번호와 이름 조회
set serveroutput on;
declare
    sonno emp.empno%type;
    sonname emp.ename%type;
begin
    select empno, ename into sonno, sonname
    from emp
    where ename = 'SMITH';
    dbms_output.put_line('사번 이름');
    dbms_output.put_line('--------------');
    dbms_output.put_line(''||sonno||''||sonname);
end;

--PL/SQL의 제어문
--단일 IF THEN 문
SET SERVEROUTPUT ON;
DECLARE
    SONEMP EMP%ROWTYPE;
    SONSAL NUMBER(7,2);
BEGIN 
    SELECT * INTO SONEMP
    FROM EMP
    WHERE ENAME = 'SMITH';
    --커미션이 NULL일 경우를 조건에 지정하고 수행
    IF (SONEMP.COMM IS NULL) THEN
    SONSAL := SONEMP.SAL*12;
    --조건이 FALSE이거나 NULL이면 수행 종료
    END IF;
    DBMS_OUTPUT.PUT_LINE('사번 이름 커미션');
    DBMS_OUTPUT.PUT_LINE('-------------------');
    DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||''||SONEMP.ENAME||''||SONSAL);
END;

--부서번호로 부서명 확인
DECLARE
    SONNO EMP.EMPNO%TYPE;
    SONNAME EMP.ENAME%TYPE;
    SONDEPTNO EMP.DEPTNO%TYPE;
    --SONDNAME 변수를 NULL로 초기화한다.
    SONDNAME VARCHAR2(20) := NULL;
BEGIN
    SELECT EMPNO, ENAME, DEPTNO
    INTO SONNO, SONNAME, SONDEPTNO
    FROM EMP
    WHERE EMPNO = 7369;
    --SONDEPTNO 변수가 10일 경우를 조건에 지정하고 수행
    IF (SONDEPTNO = 10) THEN
            SONDNAME := 'ACCOUNTING';
    END IF;
    IF (SONDEPTNO = 20) THEN
            SONDNAME := 'CLERK';
    END IF;
    IF (SONDEPTNO = 30) THEN
            SONDNAME := 'SALES';
    END IF;
    IF (SONDEPTNO = 40) THEN
            SONDNAME := 'OPERATIONS';
    END IF;
    DBMS_OUTPUT.PUT_LINE(' 사번 이름 부서명');
    DBMS_OUTPUT.PUT_LINE('-----------------------');
    DBMS_OUTPUT.PUT_LINE(''||SONNO||''||SONNAME||''||SONDNAME);
END;

--이중 IF THEN ELSE문
--사원명으로 연봉 조회
DECLARE 
    SONEMP EMP%ROWTYPE;
    SONSAL NUMBER(7,2);
BEGIN
    SELECT * INTO SONEMP
    FROM EMP
    WHERE ENAME = 'SMITH';
    IF(SONEMP.COMM IS NULL) THEN
        SONSAL := SONEMP.SAL*12;
    ELSE--커미션이 NULL이 아닐 때 수행
        SONSAL := SONEMP.SAL*12+SONEMP.COMM;
    END IF;
    DBMS_OUTPUT.PUT_LINE(' 사번 이름 연봉');
    DBMS_OUTPUT.PUT_LINE('-----------------------');
    DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||''||SONEMP.ENAME||''||SONSAL);
END;

--다중 IF THEN ELSIF ELSE 문
--EMP테이블에서 부서번호로 부서명 확인
DECLARE
    SONEMP EMP%ROWTYPE;
    SONDNAME VARCHAR2(14);
BEGIN
    SELECT*INTO SONEMP
    FROM EMP
    WHERE ENAME = 'SMITH';
    IF(SONEMP.DEPTNO = 10)THEN
        SONDNAME := 'ACCOUNTING';
    ELSIF(SONEMP.DEPTNO = 20)THEN
        SONDNAME := 'CLERK';
    ELSIF(SONEMP.DEPTNO = 30)THEN
        SONDNAME := 'SALES';
    ELSIF(SONEMP.DEPTNO = 40)THEN
        SONDNAME := 'OPERATIONS';
    END IF;
    DBMS_OUTPUT.PUT_LINE(' 사번 이름 부서명');
    DBMS_OUTPUT.PUT_LINE('--------------------------');
    DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||''||SONEMP.ENAME||''||SONDNAME);
END;

--반복문
--LOOP END LOOP문으로 1부터 5까지 출력하기

DECLARE
    NUM NUMBER := 1;
BEGIN 
    --END LOOP문에서 제어권을 전달받고 반복
    LOOP
        DBMS_OUTPUT.PUT_LINE(NUM);
        --NUM 변수에 1을 더하여 NUM 변수에 할당하여 누적
        NUM := NUM+1;
        IF (NUM>5) THEN
            EXIT;
        END IF;
        --제어문을 LOOP문으로 전달
    END LOOP;
END;

--FOR IN END LOOP
--1부터 5까지 출력

DECLARE
BEGIN
    FOR NUM IN 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE(NUM);
    END LOOP;
END;

--WHILE...LOOP...END LOOP 문
DECLARE
    NUM NUMBER := 1;
BEGIN 
    WHILE (NUM <= 5) LOOP
        DBMS_OUTPUT.PUT_LINE(NUM);
        NUM := NUM + 1;
    END LOOP;
END;

 

댓글