DROP SEQUENCE DEPT_TEMP_SEQ;
이런 메세지가 뜨면 성공이다.
조회속도 향상을 위해 컬럼에 인덱스를 생성함 컬럼에 인덱스를 지정해서 생성하면 된다. 예를 들어 어떤 사이트에서 이름검색이 검색이 너무 느려 DB에 INDEX를 생성해서 속도를 올릴수 있다.
CREATE INDEX IX_EMPLOYEE_ENAME ON EMPLOYEE(ENAME);
여기서 INDEX를 확인할 수 있다. 우리가 만든 INDEX가 생긴것을 확인 할 수 있다. 이러면 INDEX만 차지하는 공간을 만든뒤 여기에 INDEX를 저장한다.
테이블에 어떤 INDEX가 있는지를 명령어로 확인이 가능하다.
USER_IND_COLUMNS은 SQL에서 제공하는 테이블로 INDEX기록을 지닌다.
SELECT *
FROM USER_IND_COLUMNS
WHERE TABLE_NAME IN ('EMPLOYEE','DEPARTMENT');
EMPLOYEE와 DEPARTMENT에 어떤 인덱스가 있는지 확인 할 수 있다.
다음과같이 어떤 테이블에 어떤 INDEX가 걸려 있는 지를 알 수 있다.
CREATE INDEX IX_DEOARTMENT_DNAME ON DEPARTMENT(DNAME);
이런 메세지가 뜨면 성공한 것이다.
컬럼 여러개를 동시에 인덱스 1개로 생성 할 수 있다.
예를 들어
SELECT * FROM DEPARTMENT
WHERE DNAME = 'SALES'
AND LOC = 'NEW YORK'
위 두 컬럼에 대한 인덱스를 만들려면 원래는 각 컬럼에 대한 2개의 INDEX를 만들어야 했다.
하지만 결합 INDEX를 사용하면 하나의 INDEX문으로 두개의 컬럼을 INDEX시킬 수 있다.
CREATE INDEX IX_DEPARTMENT_DNAME_LOC ON DEPARTMENT(DNAME, LOC);
결합인덱스는 WHERE절에서 AND 로 두개의 컬럼이 나올때 사용하면 된다.
SQL함수 또는 산술식에 인덱스를 걸 수 있다.
다음과 같은 쿼리문이 있다고 하자.
SELECT * FROM EMPLOYEE
WHERE SALARY = SALARY * 12;
여기서 SALARY * 12을 인덱스로 만들어보자
CREATE INDEX IX_EMPLOYEE_ANNSAL ON EMPLOYEE(SALARY * 12);
이렇게 해주면 INDEX가 완성된다.
ORACLE DB의 기본 관리자는 SYSTEM이다. 계정생성, 권한주기 등 거의 대부분의 작업을 수행한다.
유저를 만들고 암호를 지정해보자.
CREATE USER usertest01 IDENTIFIED BY pass1;
반드시 관리자 계정으로 만들어야한다.
다음과 같은 메세지가 뜨면 성공이다.
DROP USER usertest01;
이 메세지가 뜨면 삭제가 완료된다. 단 삭제전 접속을 해제해야한다.
위에서 만든 유저에 접속권한을 부여해보자.
GRANT CREATE SESSION TO usertest01; -- 접속권한 GREATE SESSION
다음과 같은 메세지가 뜨면 접속권한이 주어진 것이다.
위에서 만든 유저에 테이블 생성 권한을 부여해보자.
GRANT CREATE TABLE TO usertest01; -- TABLE 만드는 권한 주기
다음과 같은 메세지가 뜨면 테이블 생성 권한이 주어진 것이다.
위에서 만든 유저에 공간사용 권한을 부여해보자.
GGRANT UNLIMITED TABLESPACE TO usertest01;
다음과 같은 메세지가 뜨면 공간 사용 권한이 주어진 것이다.
이렇게 권한들을 하나 하나 부여하면 너무 비효율적이다. 그래서 한번에 여러권한을 줄 수 있게 만든 기능이 있는데 이게 ROLE이다. 이걸 부여하면 관련된 권한들을 모두 한번에 부여가 가능하다.
GRANT CONNECT, RESOURCE, CREATE VIEW TO usertest01;
이 메세지가 뜨면 role부여가 된 것이다.
다른 계정의 테이블이나 인덱스를 사용하려면 "FROM 계정.테이블" 이렇게 불러와야한다. 하지만 너무 길기 때문에 별명을 붙여서 별명으로만 사용을 할 수 있다.
관리자 계정으로 테이블을 생성해서 다른 계정으로 테이블을 조회해보자.
SAMPLETBL이라는 이름의 테이블을 만들었다.
다른 계정에서 테이블을 조회하려면 권한부여를 먼저 해줘야한다.
GRANT SELECT ON SAMPLETBL TO scott; -- 조회권한
GRANT CREATE SYNONYM TO scott; -- 동의어 생성 권한
SCOTT계정에서 관리자 계정의 테이블 조회가 가능하다.
CREATE SYNONYM SAMPLETBL FOR SYSTEM.SAMPLETBL;-- 동의어(별명) 생성
SELECT * FROM SAMPLETBL; -- 동의어 조회
새로 만든 이름으로도 조회가 가능해진다.
DROP SYNONYM SAMPLETBL;
삭제되었다.
보안을 유지하기 위해 1개 이상의 테이블이나 다른 뷰를 이용해서 생성하는 가상의 테이블이다.
예를 들어 사원 테이블에 급여는 다른 사람이 봐서는 안된다. 이때 VIEW를 이용하여 가상의 테이블을 만들어 작업을 하면 SALARY를 노출시키지 않고 작업을 할 수 있다.
CREATE OR REPLACE VIEW VW_EMP_JOB(ENO, ENAME, DNO, JOB)
AS
SELECT ENO, ENAME, DNO, JOB
FROM EMPLOYEE
WHERE JOB LIKE 'SALESMAN%'
급여 컬럼을 없애고 직무가 SALESMAN인 행만 보여주자.
이 메세지가 뜨면 성공이고 뷰파일에 위치된다.
SELECT * FROM VW_EMP_JOB;

또 어떤 테이블에 view가 있는지를 알 수 있는 방법이 있다.
SELECT * FROM USER_VIEWS
user_views 테이블에 view 데이터들이 저장된다.
참고로 INSERT도 가능하다. 단 WITH READ ONLY를 사용하면 INSERT는 부가능하다.
CREATE OR REPLACE VIEW VW_EMP_JOB_READ
AS
SELECT ENO, ENAME, DNO, JOB
FROM EMPLOYEE
WHERE JOB LIKE '%MANAGER%' WITH READ ONLY;
이런식으로 하면 INSERT가 불가하다.

CREATE OR REPLACE VIEW VW_EMP_SALARY
AS
SELECT DNO, SUM(SALARY) AS SAL_SUM, ROUND(AVG(SALARY)) AS SAL_AVG
FROM EMPLOYEE
GROUP BY DNO;
SQL 그룹함수처럼 VIEW도 똑같이 그룹함수를 만들면된다.
DROP VIEW VW_EMP_SALARY;
이 메세지가 있으면 삭제가 잘 된다.
주로 중급자들이 하고 난이도가 굉장히 높아서 내가 당장 할 일은 없지만 침고만 하자.
처리 속도가 빠르고 제어문, 변수들이 있다.
-- 26_Procedure.sql
-- DB 프로그래밍 분야 : sql 숙련자들이 코딩함
-- 중급 개발자가 주로 개발함
-- 난이도 높음
-- 소스 : Oracle DB 내에 저장됨
-- 장점 : 1) 처리속도 빠름
-- 특징 : 1) 제어문(조건문/반복문), 변수/상수
-- 프로시저 정의 (3단계)
-- 1) 선언부 : 변수 정의 , 변수값 받기(매개변수)
-- 2) 실행부(BEGIN) : 본격적인 코딩
-- 3) 예외처리(EXCEPTION) : 예외 블럭 처리
-- 4) 종료 : END , 프로시저 끝
-- 1) 화면 출력 모드 ON
SET SERVEROUTPUT ON;
-- 예제 1) 매개변수 2개의 합을 출력
-- in : 매개변수의 의미
-- 사용법) CREATE OR REPLACE PROCEDURE 프로시저명(
-- 매개변수 in 자료형,
-- ...
-- )
-- IS
-- 변수 자료형(자리수); -- 선언부
-- BEGIN
-- 실제 코딩
-- END;
-- /
-- 화면출력 함수 : dbms_output.put_line('문자열')
CREATE OR REPLACE PROCEDURE pro_exam01
(
-- 매개변수 부분 : 함수 매개변수와 비슷
p_num1 in NUMBER,
p_num2 in NUMBER
)
IS
-- 선언부 : 변수정의
v_sum NUMBER(10);
BEGIN
-- 실행블럭 : 본격 코딩
-- 합 계산 : v_sum := p_num1 + p_num2
-- := : 대입연산자
v_sum := p_num1 + p_num2;
-- db 출력 : 1줄 출력
-- || : 문자열 붙이기 연산자
-- 사용법) dbms_output.put_line(변수)
dbms_output.put_line('총합은 : ' || v_sum);
END;
/
-- 프로시저 실행 방법
-- 사용법) CALL 프로시저명(매개변수, 매개변수2,...);
CALL pro_exam01(1,2);
-- 예제 2) 입력받은 사원번호에 해당하는 월급 출력하기 : 사원테이블
-- 입력값 : 7788
CREATE OR REPLACE PROCEDURE pro_exam02
(
p_num1 in NUMBER -- 매개변수 (7788)
)
IS
v_sal NUMBER(10); -- 결과 저장 변수
BEGIN
-- 입력받은 사원번호에(ENO) 해당하는 월급(SALARY) 출력
-- 사용법) SELECT 컬럼명 INTO 변수 : 컬럼값 -> 변수에 저장됨
SELECT SALARY INTO v_sal
FROM EMPLOYEE
WHERE ENO = p_num1;
dbms_output.put_line('월급은 : ' || v_sal);
END;
/
-- 프로시저 실행 방법
CALL pro_exam02(7788);
-- 예제 3) 조건문 : IF/ELSIF/ELSE/END IF;
CREATE OR REPLACE PROCEDURE pro_exam03
(
p_num1 in NUMBER -- 매개변수
)
IS
BEGIN
-- 입력값에 따라 짝수/홀수 인지 출력하세요 : MOD(값, 나누기) => 결과:나머지
-- =(등호) : 비교연산자 , 같다
IF MOD(p_num1, 2) = 0 THEN
dbms_output.put_line('짝수');
ELSE
dbms_output.put_line('홀수');
END IF;
END;
/
-- 프로시저 실행 방법
CALL pro_exam03(2);
-- 예제 4) 반복문 : 커서(cursor)
-- 커서(cursor) : select 문의 결과로 여러건을 가지고 있는 변수
CREATE OR REPLACE PROCEDURE pro_exam04
(
p_num1 in NUMBER -- 매개변수
)
IS
-- 선언부
-- 커서 정의 : 배열과 비슷, select 문의 결과
-- 사용법) CURSOR 커서변수명 IS SELECT ~ 문
CURSOR emp_cursor IS
SELECT ENAME, SALARY, DNO
FROM EMPLOYEE
WHERE DNO = p_num1; -- 부서번호(매개변수)
BEGIN
-- FOR문 : 반복문
-- 자바의 향상된 FOR 문 과 비슷 : 예) for(자료형 변수 : 배열){}
-- 특징 : 증감식 없음, 데이터 끝에 도달하면 반복문 종료
FOR emp_record IN emp_cursor LOOP
-- 반복문 실행부분
-- emp_record : 커서의 1행만 차례대로 들어감
-- 차례로 화면에 출력하기
DBMS_OUTPUT.PUT_LINE(emp_record.ename || ' ' || emp_record.salary
|| ' ' || emp_record.dno);
END LOOP;
END;
/
-- 프로시저 실행 방법
CALL pro_exam04(20);
-- 예제) 부서번호를 매개변수로 받아서 위치를 출력하는 함수 정의
-- 사용법) CREATE OR REPLACE FUNCTION 평션명(매개변수 in 자료형)
-- RETURN 리턴값자료형
-- 예제 5) 평션 만들기
-- 예제) 부서번호를(DNO) 매개변수로 받아서 부서위치를(LOC) 출력하는 함수 정의
-- 사용법) CREATE OR REPLACE FUNCTION 평션명(매개변수 in 자료형)
-- RETURN 리턴값자료형
-- 예약어 : 테이블명.컬럼명%type => 테이블명에 해당하는 컬럼의 자료형을 가져옴
-- 예) DEPARTMENT.DNO%TYPE => DEPARTMENT 테이블의 DNO 컬럼의 자료형 : NUMBER
CREATE OR REPLACE FUNCTION fn_exam05
(
p_num1 in DEPARTMENT.DNO%type -- 매개변수 자료형 (NUMBER)
)
RETURN DEPARTMENT.LOC%TYPE
IS
-- 선언부
v_loc DEPARTMENT.LOC%TYPE; -- 부서 테이블의 LOC 자료형 참고
BEGIN
-- 부서번호를(DNO) 매개변수로 받아 위치를(LOC) 조회하는 SQL문
SELECT LOC INTO v_loc
FROM DEPARTMENT
WHERE DNO = p_num1; -- 부서번호 매개변수
RETURN v_loc;
END;
/
-- 함수 실행방법 :
SELECT fn_exam05(10) FROM DUAL;