티스토리 뷰
-- 고급!!
-- 오라클 데이터베이스(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;
블럭잡고 실행하면 창이 뜨고 가이드 메시지에 맞는 값을 입력하면 된다!
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;
/