티스토리 뷰

-- 고급!!
-- 오라클 데이터베이스(SQL): 웹 어플리케이션(자바) 연동, 데이터 저장소

-- 1. DDL(Data Definition Langusage)
-- CREATE 오라클객체(시퀀스,뷰..) 객체명(AS, 소괄호..객체에 맞게)
-- , ALTER 오라클객체 객체명 AND, MODIFY, DROP
-- , DROP 오라클객체 객체명 
-- 제약조건(6가지): 데이터 무결성 보장
-- -> NOT NULL, UNIQUE, PK, FK, CHECK, DEFAULT

-- 오라클 데이터타입: 숫자(NUMBER), 문자(CHAR, VARCHAR2), 날짜(DATE, TIMESTAMP)

-- 2. DCL (Data Control Language)
-- GRANT 권한명/ROLE이름 TO 유저명
-- , REVOTE 권한명/ROLE이름 FROM(뺏어오니까) 유저명

-- 3. DML (Data Manipulation Language)
-- INSERT INTO 테이블명 VALUES 컬럼명1,컬럼명2.. VALUES 값1,값2...;
-- , UPDATE 테이블명 SET 컬럼명1=값1 WHERE 컬럼명2=값2;
-- , DELETE FROM 테이블명 WHERE 컬럼명1=값1; 

-- 3-1. DQL (Data Query Language)
-- SELECT 컬럼명1, 컬럼명2.. FROM 테이블명 WHERE 컬럼명1=값1;

-- 오라클 함수: 단일행 함수(숫자처리함수, 문자처리함수, 날짜처리함수)
--, 그룹함수(SUM, AVG, GROUP BY, HAVING...)

-- 집합연산자(UNION, UNION ALL, INTERSECT, MINUS)

-- ROLLUP, CUBE, GROUPING, GROUPING SETS:집계함수
-- INNER JOIN, OUTER JOIN, SELF JOIN, CROSS JOIN, NON-EQUI JOIN
-- 서브쿼리(단일행, 다중행, 다중열, 다중행 다중열, 상관쿼리, 스칼라 서브쿼리)

-- 4. TCL (Transaction Control Language)
-- COMMIT, ROLLBACK, SAVEPOINT

-- 오라클 객체
-- 1. VIEW: STORED VIEW, INLINE VIEW
-- 데이터 딕셔너리 -> 데이터 딕셔너리 뷰: USER_, ALL_, DBA_
-- 2. SEQUENCE: 자동번호발생기, 번호를 기억하고 지정한 만큼 증가시켜줌
-- INSERT INTO ~ VALUES 시퀀스명.NEXTVAL ...;
-- 시퀀스 확인은 시퀀스명.CURRVAL

 


-- ================3. ROLE ================


-- -> 사용자에게 여러 개의 권한을 한번에 부여할 수 있는 데이터베이스 객체
-- -> 사용자에게 권한을 부여할 때 한 개씩 부여하게 되면 권한 부여 및 회수가 불편함

-- DCL(Data Control Language): GRANT/ REVOKE

-- 권한부여 및 회수는 관리자 세션(빨간창)에서 사용가능
-- 관리자 계정
-- 1. SYS   : DB 생성/삭제 권한 있음, 로그인 옵션으로 AS SYSDBA 지정해야 로그인 가능
-- 2. SYSTEM: 일반관리자, DB 생성/삭제 권한 없음

--<<권한 확인>>
-- ROLE에 부여된 시스템 권한
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'CONNECT'; --KH계정에서 사용
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'RESOURCE'; --KH계정에서 사용
--계정에 부여된 롤과 권한 확인
SELECT * FROM USER_ROLE_PRIVS;
SELECT * FROM USER_SYS_PRIVS;

--===================== 관리자 권한 필요 ===================
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'CONNECT'; --관리자(시스템)계정에서 사용
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'RESOURCE'; --관리자(시스템)계정에서 사용
--ROLL생성은 빨간창에서 해줘야 함
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE; 
--세션 미 변경시, ORA-65096: 공통 사용자 또는 롤 이름이 부적합합니다. 오류 발생
--세션에서 TRUE로 SET한 후에 ROLL생성
CREATE ROLE VIEWRESOURCE;
--ROLL에 권한 부여
GRANT CREATE VIEW TO VIEWRESOURCE;
--확인
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'VIEWRESOURCE';

GRANT CONNECT, RESOURCE TO KH;
GRANT CREATE VIEW TO KH;

-- ================ GRANT 실습 ===================

* 파란창과 초록창은 같은 계급(다만 다른 계정)/ 빨간창만 상위 계급
-- ================ 파란창 KH에서 진행 =============
CREATE TABLE COFFEE(
    PRODUCT_NAME VARCHAR2(20) PRIMARY KEY,
    PRICE NUMBER NOT NULL,
    COMPANY VARCHAR2(20) NOT NULL
);

DESC COFFEE;--테이블의 껍데기를 하기 위해

INSERT INTO COFFEE VALUES('진저레몬티', 5000, 'OHCOFFEE');
INSERT INTO COFFEE VALUES('큐브라떼', 4300, 'MGC');
INSERT INTO COFFEE VALUES('아아', 2000, 'OHCOFFEE');
INSERT INTO COFFEE VALUES('아바라', 5500, 'STARBUCKS');
INSERT INTO COFFEE VALUES('카페라떼', 4800, 'STARBUCKS'); --KHUSER01계정에서 조회 후 추가

SELECT*FROM COFFEE;

COMMIT;

-- ================ 초록창 KHUSER01에서 실행 =================
SELECT * FROM KH.COFFEE;
DESC COFFEE;
--ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
--KHUSER01 계정은 KH계정의 COFFEE 테이블을 조회할 권한이 없음
--그렇다면 조회할 수 있는 권한을 부여해보자~
-- ================== 빨간창 SYSTEM에서 실행 ==================
-- KHUSER01이 KH의 COFFEE 테이블을 SELECT할 수 있는 권한을 부여
GRANT SELECT ON KH.COFFEE TO KHUSER01;
-- ================== 초록창 KHUSER01에서 실행 ==================
SELECT * FROM KH.COFFEE;
-- COFFEE 테이블 조회가 가능해짐, 권한부여가 되었기 때문에 조회가 가능해짐
-- 트렌지션 걸려있는건 안보임 -> 파란창에서 COMMIT(트렌젝션 처리)해줘야 함
-- 권한부여 후 테이블 조회가 가능하나 그 이후에 INSERT한 데이터는 
-- COMMIT하지 않으면 조회가 안됨 -> INSERT를 한 세션에서 트렌젝션 처리를 해주어야 함
--(파란창에서 COMMIT 후 초록창에서 조회가능)
-- ================ 파란창 KH에서 진행 =============
COMMIT;
-- ================== 빨간창 SYSTEM에서 실행 ==================
-- 이제부터는 권한 회수
-- 권한회수하면 초록창에서 SELECT*FROM KH.COFFEE 조회가 되지 않음
-- 권한회수
REVOKE SELECT ON KH.COFFEE FROM KHUSER01;
-- ================ 초록창 KHUSER01에서 실행 =================
-- SELECT 권한 회수 후 다시 조회
SELECT * FROM KH.COFFEE;
-- ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

 


-- INSERT 권한 부여 및 회수 실습
-- ================ 초록창 KHUSER01에서 실행 =================
INSERT INTO KH.COFFEE VALUES('디카페인 아아', 2000, 'OHCOFFEE');
--SQL 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
-- ================== 빨간창 SYSTEM에서 실행 ==================
-- 권한 부여
GRANT SELECT ON KH.COFFEE TO KHUSER01;
-- Grant을(를) 성공했습니다. 메시지 확인
-- ================ 초록창 KHUSER01에서 실행 =================
INSERT INTO KH.COFFEE VALUES('디카페인 아아', 2000, 'OHCOFFEE');---?안됨
-- ================ 파란창 KH에서 진행 =============
--데이터 확인
SELECT * FROM KH.COFFEE;
--COMMIT하지 않아 데이터 조회 안됨
-- ================ 초록창 KHUSER01에서 실행 =================
COMMIT;
-- 트랜젝션 완료 후 조회해야 조회가능
-- ================ 파란창 KH에서 진행 =============
--데이터 확인
SELECT * FROM KH.COFFEE;
--정렬후 오더바이?
-- ================== 빨간창 SYSTEM에서 실행 ==================
-- REVOKE 'FROM'!!!!!!!!!!!!!!
-- 권한회수
REVOKE SELECT ON KH.COFFEE FROM KHUSER01;
-- ================ 초록창 KHUSER01에서 실행 =================
INSERT INTO KH.COFFEE VALUES('디카페인 아아', 2000, 'OHCOFFEE');
-- 권한회수 했기 때문에 
-- 메시지 출력. INSERT가 되지 않음

--오라클 객체 1.VIEW, 2.SEQUENCE, 3.ROLE, 4.INDEX

-- ================= 4. INDEX ===================


-- B-TREE 인덱스 -> B+TREE 인덱스

-- -> SQL 명령문의 처리속도를 향상시키기 위해서 컬럼에 대해서 생성하는 오라클 객체
-- - KEY-VALUE 형태로 생성이 되며 KEY에는 인덱스로 만들 컬럼값, 
--   VALUE에는 행이 저장된 주소값이 저장됨
-- * 장점: 검색속도가 빨라지고 시스템에 걸리는 부하를 줄여서 시스템 전체 성능을 향상시킬 수 있음
-- * 단점: 1. 인덱스를 위한 추가 저장공간이 필요하고 인덱스를 생성하는데 시간이 걸림
--        2. 데이터의 변경작업(INSERT, UPDATE, DELETE)이 자주 일어나는 테이블에 
--           INDEX 생성시 오히려 성능저하가 발생할 수 있음
-- * 어떤 컬럼에 인덱스를 만들면 좋을까?
-- -> 데이터값이 중복된 것이 없는 고유한 데이터값을 가지는 컬럼에 만드는 것이 제일 좋음
-- 그리고 자주 사용되는 컬럼에 만들면 좋음
-- * 범칙은 아니지만 기준이 될 수 있는 효율적인 인덱스 사용 예
-- 1. WHERE 절에 자주 사용되는 컬럼에 인덱스 생성
-- 2. 두개 이상의 컬럼 WHERE절이나 조인조건으로 자주 사용되는 경우
-- 3. 한번 입력된 데이터의 변경이 자주 일어나지 않는 경우 EX.도서관
-- 4. 한 테이블에 저장된 데이터 용량이 상당히 클 경우

SELECT * FROM EMPLOYEE;

-- 인덱스 생성, 컬럼에 생성하는 객체(컬럼에 인덱스를 건다)
CREATE INDEX IND_EMP_NAME
ON EMPLOYEE(EMP_NAME);

CREATE INDEX IND_EMP_COLS
ON EMPLOYEE(EMP_NAME, EMP_NO, HIRE_DATE);

-- 인덱스 확인
SELECT * FROM USER_IND_COLUMNS WHERE INDEX_NAME = 'IND_EMP_NAME';

-- 인덱스 삭제
DROP INDEX IND_EMP_NAME;

--튜닝시 사용되는 명령어
-- #1
EXPLAIN PLAN FOR
SELECT * FROM EMPLOYEE
WHERE EMP_NO LIKE '%04%';

--결과 확인
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

--#2
SET TIMING ON;--시간셋팅

SELECT * FROM EMPLOYEE
WHERE EMP_NO LIKE '%04%';
-- 공부하면 튜닝까지 가능

SET TIMING OFF;


-- ================ PL/SQL (반복문/IF문 쓸수 있다) =======================

-- ORACLE'S PROCEDURAL LANGUAGE EXTENSION TO SQL의 약자
-- -> 오라클 자체에 내장되어 있는 절차적 언어로써, SQL의 단점을 보완하여
-- SQL문장 내에서 변수의 정의(DECLARE), 조건처리, 반복처리 등을 지원함

-- PL/SQL의 유형
-- 1.익명블록(ANONYMOUS BLOCK) : 약간 인라인 느낌??
-- 2.프로시저(PROCEDURE) : 익명블록에 이름 붙여저장
-- 3.함수(FUNCTION) : 프로시저가 리턴값이 있으면 함수값

-- PL/SQL의 구조(익명블록)
-- 1. 선언부(선택)   : DECLARE
-- 2. 실행부(필수)   : BEGIN
-- 3. 예외처리부(선택): EXCEPTION
-- 4. END;(필수)
-- 5. /(필수)

-- PL/SQL 하기전에 실행해야 하는 명령어(꼭해줘야 함)
SET SERVEROUTPUT ON;
-- 이걸 실행해야 아래에서 이것도 나옴 'HELLO PL/SQL'(2)

BEGIN 
    DBMS_OUTPUT.PUT_LINE('HELLO PL/SQL');

    --==자바의 SYSOUT 과 같다
END;
/
-- 실행 안하고 하면 'PL/SQL 프로시저가 성공적으로 완료되었습니다.' 얘만 나옴(1)

-- PL/SQL에서 변수 쓰는 방법
DECLARE --변수선언 꼭 써야 한다.
    VID NUMBER;--타입은 숫문날( 숫자 : NUMBER, 문자 :CHAR, VARCHAR2, 날짜 :DATE, TIMESTAMP)
BEGIN
    SELECT EMP_ID
    INTO VID
    FROM EMPLOYEE
    WHERE EMP_NAME = '선동일';
    DBMS_OUTPUT.PUT_LINE('ID='||VID);
END;
/
--ID=200    PL/SQL 프로시저가 성공적으로 완료되었습니다.

DECLARE --변수선언
    VID NUMBER;
BEGIN
    SELECT EMP_ID
    INTO VID
    FROM EMPLOYEE
    WHERE EMP_NAME = '선동일';
    DBMS_OUTPUT.PUT_LINE('ID='||VID);
EXCEPTION
    WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO DATA~');
END;
/
--변수에 데이터를 담아서 출력까지 가능
--셀렉트를 확장해서 쓸 수 있다

-- ============== 2.PL/SQL 변수 ================
/*
    # 변수의 자료형
    1. 기본 자료형
    - CHAR, VARCHER2, NUMBER, DATE, ...
    2. 복합 자료형
    - RECORD, CURSOR, COLLECTION,...
    2-1. %TYPE 변수
    내가 가져오려고 했던 테이블의 컬럼 타입을 그대로 가져오는 방법
*/
DESC EMPLOYEE; --껍데기를 보고 채워(기본 자료형 쓰려면)

DECLARE
    VEMPNO EMPLOYEE.EMP_NO%TYPE;
    VENAME EMPLOYEE.EMP_NAME%TYPE;
    VSAL   EMPLOYEE.SALARY%TYPE;
    VHDATE EMPLOYEE.HIRE_DATE%TYPE;
--    VEMPNO CHAR(14);
--    VENAME VARCHAR2(20);
--    VSAL NUMBER;
--    VHDATE DATE;
BEGIN
    SELECT EMP_NO, EMP_NAME, SALARY, HIRE_DATE
    INTO VEMPNO, VENAME, VSAL, VHDATE
    FROM EMPLOYEE
    WHERE EMP_ID = '203';
    DBMS_OUTPUT.PUT_LINE(VEMPNO||':'||VENAME||':'||VSAL||':'||VHDATE);
END;
/

--익명블록을 이용해서 스크립트로 출력할 수 있다???????????????

-- @실습문제1
-- 사번, 사원명, 직급명을 담을 수 있는 참조변수(%TYPE)를 통해서
-- 송종기 사원의 사번, 사원명, 직급명을 익명블럭을 통해 출력하세요.

DESC EMPLOYEE;
DECLARE
    VEMPID EMPLOYEE.EMP_ID%TYPE;
    VENAME EMPLOYEE.EMP_NAME%TYPE;
    VJNAME JOB.JOB_NAME%TYPE;
BEGIN
    SELECT EMP_ID, EMP_NAME, JOB_NAME
    INTO VEMPID, VENAME, VJNAME
    FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE)
    WHERE EMP_NAME = '송종기';
    DBMS_OUTPUT.PUT_LINE(VEMPID||'::'||VENAME||'::'||VJNAME);
END;
/

--2-2. %ROWTYPE
--행(ROW) 단위로 참조하는 속성, 전체 칼럼의 데이터를 사용할 때 유용함
DECLARE
    VEMP EMPLOYEE%ROWTYPE;
BEGIN
    SELECT *
    INTO VEMP
    FROM EMPLOYEE
    WHERE EMP_NAME = '송종기';
    DBMS_OUTPUT.PUT_LINE(VEMP.EMP_ID||':::'||VEMP.EMP_NAME);
END;
/

-- ============== 3. PL/SQL 입력받기 =================

DECLARE
    VEMP EMPLOYEE%ROWTYPE;
BEGIN
    SELECT *
    INTO VEMP
    FROM EMPLOYEE
    WHERE EMP_NAME = '&EMP_ID';--입력받고 싶을 때 &가이드메시지
    DBMS_OUTPUT.PUT_LINE(VEMP.EMP_ID||':::'||VEMP.EMP_NAME);
END;
/

-- @실습문제2
-- 사원번호를 입력받아서 해당 사원의 사원번호, 이름, 부서코드, 부서명을 출력하세요.
DECLARE
    VEMPID EMPLOYEE.EMP_ID%TYPE;
    VENAME EMPLOYEE.EMP_NAME%TYPE;
    VDCODE EMPLOYEE.DEPT_CODE%TYPE;
    VDNAME DEPARTMENT.DEPT_TITLE%TYPE;
BEGIN
    SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
    INTO VEMPID, VENAME, VDCODE, VDNAME
    FROM EMPLOYEE
    LEFT OUTER JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID
    WHERE EMP_ID = '&EMP_ID';
    DBMS_OUTPUT.PUT_LINE(VEMPID||':'||VENAME||':'||VDCODE||':'||VDNAME);
END;
/

-- @실습문제3
-- EMPLOYEE 테이블에서 사번의 마지막 번호를 구한뒤 +1한 사번에 사용자로부터
-- 입력받은 이름, 주민번호, 전화번호, 직급코드, 급여등급을 등록하는 PL/SQL을 작성하시오.

DECLARE
    VEMPID EMPLOYEE.EMP_ID%TYPE;
BEGIN--비긴 안에 쿼리문 다양하게 
    SELECT MAX(EMP_ID)+1
    INTO VEMPID
    FROM EMPLOYEE;
    
    INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, PHONE, JOB_CODE, SAL_LEVEL)
    VALUES(VEMPID, '&EMP_NAME', '&PSN', '&PHONE', '&JCODE', '&S_LEVEL');
--    VALUES(VEMPID+1여기다 해도 됨, '&EMP_NAME', '&PSN', '&PHONE', '&JCODE', '&S_LEVEL');
--    ROLLBACK;
--    
--    INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, PHONE, JOB_CODE, SAL_LEVEL)
--    VALUES('223', '일용자', '99111-1122334', 'J7', 'S3');
    COMMIT;
END;
/
SELECT * FROM EMPLOYEE ORDER BY 1 DESC;



블럭잡고 F10누르면 나옴

블럭잡고 실행하면 창이 뜨고 가이드 메시지에 맞는 값을 입력하면 된다!

EX)

NAME -> 송종기

ID -> 222

 

 

 

 

숙제용 춘계정 만들기


-- ======================== PL/SQL의 조건문 ===========================

-- 1.IF(조건식) THEN(실행문) END IF;
-- @실습문제1
-- 사원번호를 입력받아서 사원의 사번, 이름, 급여, 보너스율을 출력하시오
-- 단, 직급코드가 J1인 경우 '저희 회사 대표님입니다.'를 출력하시오.
-- 사번 : 222
-- 이름 : 이태림
-- 급여 : 2460000
-- 보너스율 : 0.35
-- 저희 회사 대표님입니다.

DECLARE
    EMP_INFO EMPLOYEE%ROWTYPE;
BEGIN
    SELECT *
    INTO EMP_INFO
    FROM EMPLOYEE
    WHERE EMP_ID = '&EMP_ID';
    DBMS_OUTPUT.PUT_LINE('사번: '||EMP_INFO.EMP_ID);
    DBMS_OUTPUT.PUT_LINE('이름: '||EMP_INFO.EMP_NAME);
    DBMS_OUTPUT.PUT_LINE('급여: '||EMP_INFO.SALARY);
    --DBMS_OUTPUT.PUT_LINE('보너스율: '||EMP_INFO.BONUS);
    --보너스율 %로 바꿔서
    DBMS_OUTPUT.PUT_LINE('보너스율: '||EMP_INFO.BONUS*100||'%');
    IF(EMP_INFO.JOB_CODE = 'J1')
    THEN DBMS_OUTPUT.PUT_LINE('저희 회사 대표님');
    END IF;
END;
/

--2. IF(조건식) THEN(실행문)ELSE(실행문) END IF;
DECLARE
    EMP_INFO EMPLOYEE%ROWTYPE;
BEGIN
    SELECT *
    INTO EMP_INFO
    FROM EMPLOYEE
    WHERE EMP_ID = '&EMP_ID';
    DBMS_OUTPUT.PUT_LINE('사번: '||EMP_INFO.EMP_ID);
    DBMS_OUTPUT.PUT_LINE('이름: '||EMP_INFO.EMP_NAME);
    DBMS_OUTPUT.PUT_LINE('급여: '||EMP_INFO.SALARY);
    DBMS_OUTPUT.PUT_LINE('보너스율: '||EMP_INFO.BONUS*100||'%');--%로 바꿔서
    IF(EMP_INFO.JOB_CODE = 'J1')
    THEN DBMS_OUTPUT.PUT_LINE('저희 회사 대표님');
    ELSE DBMS_OUTPUT.PUT_LINE('우리 회사 직원임');
    END IF;
END;
/
-- @실습문제2
-- 사원번호를 입력받아서 사원의 사번, 이름, 부서명, 직급명을 출력하시오.
-- 단, 직급코드가 J1인 경우 '대표', 그 외에는 '일반직원'으로 출력하시오.

DECLARE
    EMPID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    DTITLE DEPARTMENT.DEPT_TITLE%TYPE;
    JNAME JOB.JOB_NAME%TYPE;
    JCODE JOB.JOB_CODE%TYPE;
BEGIN
    SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_CODE, JOB_NAME
    INTO EMPID, ENAME, DTITLE, JCODE, JNAME
    FROM EMPLOYEE
    LEFT OUTER JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
    LEFT OUTER JOIN JOB USING(JOB_CODE)
    WHERE EMP_ID = '&EMP_ID';
    DBMS_OUTPUT.PUT_LINE('사번 : '||EMPID);
    DBMS_OUTPUT.PUT_LINE('이름 : '||ENAME);
    DBMS_OUTPUT.PUT_LINE('부서명 : '||DTITLE);
    DBMS_OUTPUT.PUT_LINE('직급명 : '||JNAME);
    IF(JCODE = 'J1')
    THEN DBMS_OUTPUT.PUT_LINE('대표');
    ELSE DBMS_OUTPUT.PUT_LINE('일반직원');
    END IF;
END;
/

--IF(조건식) THEN(실행문) ELSIF (조건식) THEN(실행문) ELSE(실행문) END IF;
-- @실습문제3
-- 사번을 입력 받은 후 급여에 따라 등급을 나누어 출력하도록 하시오.
-- 그때 출력 값은 사번, 이름, 급여, 급여등급을 출력하시오.
-- 500만원 이상(그외) : A
-- 400만원 ~ 499만원 : B
-- 300만원 ~ 399만원 : C
-- 200만원 ~ 299만원 : D
-- 100만원 ~ 199만원 : E
-- 0만원 ~ 99만원 : F

-- 사번 : 201
-- 이름 : 송종기
-- 급여 : 5000000
-- 급여등급 : A

DECLARE
    EMPID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    SAL   EMPLOYEE.SALARY%TYPE;
BEGIN  
    SELECT EMP_ID, EMP_NAME, SALARY
    INTO EMPID, ENAME, SAL
    FROM EMPLOYEE
    WHERE EMP_ID = '&사번';
    DBMS_OUTPUT.PUT_LINE('사번 : '||EMPID);
    DBMS_OUTPUT.PUT_LINE('이름 : '||ENAME);
    DBMS_OUTPUT.PUT_LINE('급여 : '||SAL);
    
    SAL := SAL/10000; --단위설정(나누기)
    --SALARY가 아니라 SAL로 입력해야 함
    IF(SAL<100) THEN DBMS_OUTPUT.PUT_LINE('급여등급 : F');
    ELSIF(SAL<200) THEN DBMS_OUTPUT.PUT_LINE('급여등급 : E');
    ELSIF(SAL<300) THEN DBMS_OUTPUT.PUT_LINE('급여등급 : D');
    ELSIF(SAL<400) THEN DBMS_OUTPUT.PUT_LINE('급여등급 : C');
    ELSIF(SAL<500) THEN DBMS_OUTPUT.PUT_LINE('급여등급 : B');
    ELSE DBMS_OUTPUT.PUT_LINE('급여등급 : A');
END IF;
END;
/

 

--============급여등급 출력문을 CASE문으로 바꿔보기 ============

내일 UPDATE

소수점 없애는 처리: 변수 아닌 결과값에서도 반영가능

-- 4.CASE문
/*
    CASE 변수
        WHEN 값1 THEN 실행문1
        WHEN 값2 THEN 실행문2
        WHEN 값3 THEN 실행문3
    END CASE;
*/

--예제. 입력받은 값이 1이면 빨간색 입니다. 2면 노랑색입니다. 3이면 초록색입니다를 출력하세요.
DECLARE
    INPUT NUMBER;
BEGIN
    INPUT := '&INPUT';
    CASE INPUT
        WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('빨간색입니다.');
        WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('노란색입니다.');
        WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('초록색입니다.');
    END CASE;
END;
/

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함