Unique Key를 생성하는 방법은 DBMS마다 차이가 있다.
MS-SQL은 IDENTITY를, MySQL은 auto_increment,

오라클에서는 Sequence를 사용하여 다음과 같이 유사하게 구현할 수 있다.

 

1. 자동증가컬럼을 사용하고자 하는 MYTABLE테이블을 생성한다.

CREATE TABLE MYTABLE(
	ID NUMBER, NAME VARCHAR2(20)
);

 

2. CREATE SEQUENCE 라는 문장을 사용하여 SEQ_ID라는 이름의 시퀀스를 만든다.

CREATE SEQUENCE SEQ_ID INCREMENT BY 1 START WITH 10000;

-- INCREMENT BY 1 : 증가값은 1
-- START WITH 10000 :  10000부터 증가

 

3.  테이블에 데이터 입력시에는 NEXTVAL이라는 슈도 컬럼(Pseudo-column)을 이용하여 시퀸스를 사용한다.

INSERT INTO MYTABLE VALUES( SEQ_ID.NEXTVAL, '홍길동');

-- CURRVAL : 현재 값을 반환 합니다. .
-- NEXTVAL : 현재 시퀀스값의 다음 값을 반환 합니다.

 

Sequence 구문

 

CREATE SEQUENCE sequence_name
       [START WITH n]
       [INCREMENT BY n]
       [MAXVALUE n | NOMAXVALUE]
       [MINVALUE n | NOMINVALUE]
       [CYCLE | NOCYCLE]

 

* START WITH
시퀀스의 시작 값을 지정합니다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 합니다.

* INCREMENT BY
시퀀스의 증가 값을 말합니다. n을 2로 하면 2씩 증가합니다.
START WITH를 1로 하고 INCREMENT BY를 2으로 하면 1, 3, 5,7,..
이렇게 시퀀스  번호가 증가하게 됩니다.

* MAXVALUE n | NOMAXVALUE
MAXVALUE는 시퀀스가 증가할수 있는 최대값을 말합니다.
NOMAXVALUE는 시퀀스의 값을 무한대로 지정합니다.

* MINVALUE n  | NOMINVALUE
MINVALUE는 시퀀스의 최소값을 지정 합니다.
기본값은 1이며, NOMINVALUE를 지정할 경우 최소값은 무한대가 됩니다

 

[사용규칙]

* NEXTVAL, CURRVAL을 사용할 수 있는 경우
   - subquery가 아닌 select문
   - insert문의 select절
   - insert문의 value절
   - update문의 set절

* NEXTVAL, CURRVAL을 사용할 수 없는 경우
   - view의 select절
   - distinct 키워드가 있는 select문
   - group by, having, order by절이 있는 select문
   - select, delete, update의 subquery
   - create table, alter table 명령의 default값

 

[수정]

ALTER SEQUENCE sequence_name
       [INCREMENT BY n]
       [MAXVALUE n | NOMAXVALUE]
       [MINVALUE n | NOMINVALUE]
       [CYCLE | NOCYCLE]

START WITH는 수정할수 없습니다.
START WITH 절이 없다는 점을 빼고는 CREATE SEQUENCE와 같습니다.

 

[삭제]

DROP SEQUENCE sequence_name

 


[출처] https://applejara.tistory.com/260

ERROR

ORA-12154: TNS:지정된 접속 식별자를 분석할 수 없음


해결방법

시스템변수에 환경변수 2개를 추가

(1) TNS_ADMIN: C:\app\client\사용자이름\product\12.2.0\client_1\Network\Admin

(2) ORACLE_HOME: C:\app\client\사용자이름\product\12.2.0\client_1

 

경로는 오라클이 깔려있는 각자 본인의 파일 경로를 사용

 

 

구분 테이블 정의 저장공간 ROLLBACK SQL문 종류
DELETE 존재 유지 가능 DML
TRUNCATE 존재 삭제 불가능 DDL
DROP 삭제 삭제 불가능 DDL

 

1. DELETE

  • 데이터만 삭제되며 용량은 줄어 들지 않음
  • COMMIT이전에 ROLLBACK가능
  • ROLLBACK정보를 기록하므로 TRUNCATE에 비해 느림

 

2. TRUNCATE

  • 테이블을 최초 생성된 초기 상태로 만듦
  • ROLLBACK 불가능
  • 무조건 전체 삭제만 가능

 

3. DROP

  • 테이블의 정의 자체를 완전히 삭제
  • ROLLBACK 불가능

 

1
SELECT * FROM BOOKS;
cs

 

  NAME WRITER PRICE GENRE
1 홍길동전 허균 30000 소설
2 레미제라블1 빅토르 위고 20000 소설
3 레미제라블2 빅토르 위고 30000 소설

 

BOOKS는 NAME, WRITER, PRICE, GENRE 컬럼이 다 나오는 테이블이다.

 

뷰(VIEW) 생성

1
2
3
4
CREATE OR REPLACE VIEW BOOK
AS
SELECT NAME, WRITER 
FROM BOOKS;
cs

뷰(VIEW) 조회

1
SELECT * FROM BOOK;
cs

 

  NAME WRITER
1 홍길동전 허균
2 레미제라블1 빅토르 위고
3 레미제라블2 빅토르 위고

 

BOOK는 NAME, WRITER 컬럼만 가지고 있는 VIEW이다.

 

뷰(VIEW) 삭제

 

date로 넣은 값을 'YYYY..MM..DD' 형태로 만드는 함수 만들기

 

함수 실행 화면

 

함수 결과 화면

'프로그램 > DataBase' 카테고리의 다른 글

[Oracle] Delete, Truncate, Drop 비교  (0) 2021.03.05
[PL/SQL Developer] 뷰(VIEW) 실습  (0) 2021.02.18
[Oracle] SQL 쿼리문 예제 50문제  (0) 2021.02.16
[Oracle] JOIN  (0) 2021.02.16
[Oracle] 프로시저, 함수의 이해  (0) 2021.02.16
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
--1> 부서테이블의 모든 데이터를 출력하라.
SELECT *
FROM EMP
 
--2> EMP테이블에서 각 사원의 직업, 사원번호, 이름, 입사일을 출력하라.
SELECT JOB, EMPNO, ENAME, HIREDATE
FROM EMP
 
--3> EMP테이블에서 직업을 출력하되, 각 항목(ROW)가 중복되지 않게 출력하라.
SELECT DISTINCT JOB
FROM EMP
 
--4> 급여가 2850 이상인 사원의 이름 및 급여를 출력하라.
SELECT ENAME, SAL
FROM EMP
WHERE SAL >= 2850
 
--5> 사원번호가 7566인 사원의 이름 및 부서번호를 출력하라.
SELECT ENAME, DEPTNO
FROM EMP
WHERE EMPNO = 7566
 
--6> 급여가 1500이상 ~ 2850이하의 범위에 속하지 않는 모든 사원의 이름 및 급여를 출력하라.
SELECT ENAME, SAL
FROM EMP
WHERE SAL NOT BETWEEN 1500 AND 2850
 
--7> 1981년 2월 20일 ~ 1981년 5월 1일에 입사한 사원의 이름,직업 및 입사일을 출력하되, 
-- 입사일을 기준으로 해서 오름차순으로 정렬하라.
SELECT ENAME, JOB, HIREDATE
FROM EMP
WHERE HIREDATE BETWEEN '1981-02-20' AND '1981-05-01'
ORDER BY HIREDATE
 
--8> 10번 및 30번 부서에 속하는 모든 사원의 이름과 부서 번호를 출력하되, 이름을 알파벳순으로 정렬하라.
SELECT ENAME, DEPTNO
FROM EMP
WHERE DEPTNO IN(10,30)
ORDER BY ENAME
 
--9> 10번 및 30번 부서에 속하는 모든 사원 중 급여가 1500을 넘는 사원의 이름 및 급여를 출력하라.
--(단 컬럼명을 각각 employee 및 Monthly Salary로 지정하시오)
SELECT ENAME AS 'Employee', SAL AS ' Monthly Salary'
FROM EMP
WHERE DEPTNO IN(10,30) AND SAL > 1500
 
--10> 관리자가 없는 모든 사원의 이름 및 직위를 출력하라.
SELECT ENAME, JOB
FROM EMP
WHERE MGR IS NULL
 
--11> 커미션을 받는 모든 사원의 이름, 급려 및 커미션을 출력하되, 급여를 기준으로 내림차순으로 정렬하라.
SELECT ENAME, SAL, COMM
FROM EMP
WHERE COMM IS NOT NULL
ORDER BY SAL DESC;
 
--12> 이름의 세 번째 문자가 A인 모든 사원의 이름을 출력하라
SELECT ENAME
FROM EMP
WHERE ENAMAE LIKE '__A%'
 
--13> 이름에 L이 두 번 들어가며 부서 30에 속해있는 사원의 이름을 출력하라.
SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%L%L%' AND DEPTNO = 30;
 
--14> 직업이 Clerk 또는 Analyst이면서 급여가 1000, 3000, 5000 이 아닌 
-- 모든 사원의 이름, 직업 및 급여를 출력하라. 
SELECT ENAME, JOB, SAL
FROM EMP
WHERE JOB IN('Clerk''Analyst') AND SAL NOT IN(100030005000);
 
--15> 사원번호, 이름, 급여 그리고 15%인상된 급여를 정수로 표시하되 컬럼명을 New Salary로 지정하여 출력하라.
SELECT EMPNO, ENAME, SAL,
                ROUND(SAL + (SAL*0.15), 0) AS "New Salary"
FROM EMP
 
--16> 15번 문제와 동일한 데이터에서 급여 인상분(새 급여에서 이전 급여를 뺀 값)을 추가해서 출력하라.
-- 컬럼명은 Increase로 하라.
SELECT EMPNO, ENAME, SAL, ROUND(SAL + (SAL * 0.15)) AS "New Salary",
    (ROUND(SAL + (SAL * 0.15))) - SAL AS "Increase"
FROM EMP
 
--17> 모든 사원의 이름(첫 글자는 대문자로, 나머지 글자는 소문자로 표시) 및 이름 길이를 표시하는 쿼리를 작성하고 컬럼 별칭은 적당히 넣어서 출력하라.
SELECT UPPER(SUBSTR(ENAME, 11)) || LOWER(SUNSTR(ENAME, 212)) AS "NAME",
    LENGTH(ENAME) AS "LENENAME"
FROM EMP
 
--18> 사원의 이름과 커미션을 출력하되, 커미션이 책정되지 않은 사원의 커미션은 'no commission'으로 출력하라.
SELECT ENAME, NVL(TO_CHAR(COMM), 'no commision')
FROM EMP
 
--20> 모든 사원의 이름, 부서 번호, 부서 이름을 표시하는 질의를 작성하라.(DECODE)
SELECT EMPNO, DEPTNO, DECODE(DEPTNO, 10'ACCOUNTING'20'RESEARCH'30'SALES'40'OPERATIONS') AS "DNAME"
FROM EMP;
 
--21> 30번 부서에 속한 사원의 이름과 부서번호 그리고 부서이름을 출력하라.
SELECT E.NAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 30;
 
--22> 30번 부서에 속한 사원들의 모든 직업과 부서위치를 출력하라.
--(단, 직업 목록이 중복되지 않게 하라.)
SELECT DISTINCT E.JOB, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.DEPTNO = 30;
 
--23> 커미션이 책정되어 있는 모든 사원의 이름, 부서이름 및 위치를 출력하라.
SELECT E.ENAME, D.DNAME, D.LOC
FROM EMPE, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND COMM IS NOT NULL
 
--24> 이름에 A가 들어가는 모든 사원의 이름과 부서 이름을 출력하라.
SELECT E.ENAME, D.DNAME
FROM EMP M, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.ENAME LIKE '%A%';
 
--25> Dalls에서 근무하는 모든 사원의 이름, 직업, 부서 번호 및 부서 이름을 출력하라.
SELECT E.ENAME, E.JOB, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.LOC = 'Dalls';
 
--26> 사원 이름 및 사원 번호, 해당 관리자 이름 및 관리자 번호를 출력하되,
-- 각 컬럼명을 employee, emp#, manager, mgr#으로 표시하여 출력하라.
SELECT E.ENAME AS "EMPPLOYEE", E.EMPNO AS "EMP#",
M.ENAME AS "MANAGER", M.EMPNO AS "MGR#"
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO;
 
--27> 모든 사원의 이름, 직업, 부서 이름, 급여 및 등급을 출력하라.
SELECT E.ENAME, E.JOB, D.DNAME, E.SAL, S.GRADE
FROM EMP E, DEPT P, SALGRADE S
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL BETWEEN S.LOSAL AND S.HISAL;
 
--28> Smith 보다 늦게 입사한 사원의 이름 및 입사일을 출력하라.
SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE > (SELECT HIREDATE
    FROM EMP
    WHERE ENAME = 'SMITH');
 
--30> 모든 사원의 급여 최고액, 최저액, 총액 및 평균액을 출력하되 각 컬럼명을 Maximum, Minimum, Sum, Average로 지정하여 출력하라.
SELECT MAX(SAL) AS "Maximum",MIN(SAL) AS "Minimum", SUM(SAL) AS "Sum", AVG(SAL) AS "Average"
FROM EMP
 
 
 
cs

 

31. 각 직업별로 급여, 최저액, 최고액, 총액 및 평균액을 출력해라.

 

32. 직업이 동일한 사람 수를 직업과 같이 출력해라.

 

33. 관리자의 수를 출력하되, 관리자 번호가 중복되지 않게해라. 또, 컬럼명을 Number of Manager로 지정하여 출력해라.

 

34. 최고 급여와 최저 급여의 차액을 출력해라.

 

35. 관리자 번호 및 해당 관리자에 속한 사원들의 최저 급여를 출력해라. 단, 관리자가 없는 사원 및 최저 급여가 1000미만인 그룹은 제외시키고 급여를 기준으로 출력 결과를 내림차순으로 정렬해라.

 

36. 부서별로 부서 이름, 부서 위치, 사원 수 및 평균 급여를 출력하라. 그리고 각각의 컬럼명을 부서명, 위치, 사원의 수, 평균 급여로 표시해라.

 

37. Smith와 동일한 부서에 속한 모든 사원의 이름 및 입사일을 출력해라. 단, Smith는 제외하고 출력해라.

 

38. 자신의 급여가 평균 급여보다 많은  모든사원의 사원 번호, 이름, 급여를 표시하는 질의를 작성하고 급여를 기준으로 결과를 내림차순으로 정렬해라.

 

39. 이름에 T가 들어가는 사원의 속한 부서에서 근무하는 모든 사원의 사원번호 및 이름을 출력해라.

 

40. 부서 위치가 Dallas인 모든 사원의 이름, 부서번호 및 직위를 출력하라.

 

41. KING에게 보고하는모든 사원의 이름과 급여를 출력하라.

 

42. Sales 부서의 모든 사원에 대한 부서번호, 이름 및 직위를 출력하라.

 

43. 자신의 급여가 평균 급여보다 많고 이름에 T가 들어가는 사원과 동일한 부서에 근무하는 모든 사원의 사원 번호, 이름 및 급여를 출력해라.

 

44. 커미션을 받는 사원과 급여가 일치하는 사원의 이름, 부서 번호, 급여를 출력해라.

 

45. Dallas에서 근무하는 사원과 직업이 일치하는 사원의 이름, 부서이름 및 급여를 출력해라.

 

46. SCOTT과 동일한 급여 및 커미션을 받는 모든 사원의 이름, 입사일 및 급여를 출력해라.

 

47. 직업이 CLERK인 사원들보다 더 많은 급여를 받는 사원의 사원번호, 이름, 급여를 출력하되, 결과를 급여가 높은 순으로 정렬하라.

 

48. 이름에 A가 들어가는 사원과 같은 직업을 가진 사원의 이름과 월급, 부서번호를 출력하라.

 

49. New York에서 근무하는 사원과 급여 및 커미션이 같은 사원의 사원 이름과 부서명을 출력하라.

 

50. DALLAS에서 근무하는 사원과 직업 및 관리자가 같은 사원의 사원번호, 사원 이름, 직업, 월급, 부서명, 커미션을 출력하되 커미션이 책정되지 않은 사원은 NoCommission으로 표시하고, 커미션의 컬럼명은 Comm으로나오게 출력해라. (단, 최고 월급부터 출력되게 해라.)

 

51. EMP 테이블에서 부서 인원이 4명보다 많은 부서의 부서번호, 인원수, 급여의 합을 출력해라.

'프로그램 > DataBase' 카테고리의 다른 글

[PL/SQL Developer] 뷰(VIEW) 실습  (0) 2021.02.18
[PL/SQL Developer] 함수 실습  (0) 2021.02.18
[Oracle] JOIN  (0) 2021.02.16
[Oracle] 프로시저, 함수의 이해  (0) 2021.02.16
[Oracle] 뷰(VIEW)의 이해  (0) 2021.02.16

JOIN이란?

  • 2개 이상의 테이블을 연결하여 데이터를 검색하는 방법
  • 보통 공통된 값인 PK 및 FK 값을 사용하여 조인한다.
  • 조인은 조인 연산자에 따라 From 절의 조인 형태에 따라서 구별한다.

 

조인의 종류

종류 설명
등가 조인 (equi join)
내부 조인 (inner join)
단순 조인 (simple join)
테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식
비등가 조인 (non-equi join) 등가 조인 방식 외의 방식 ex) 범위를 조건으로 지정하는 조인
자체 조인 (self join) 하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식
외부 조인 (outer join) 두 테이블 간의 조인에서 조인 기준 열의 어느 한쪽이 null이어도 강제로 출력하는 방식 (왼쪽 외부 조인과 오른쪽 외부 조인이 있다.)

 

 

■ 익명 블록과 저장 프로그램 차이점

  익명 블록 저장 서브 프로그램
이름 이름 X 이름 지정
오라클 저장 저장할 수 X 저장
컴파일 실행할 때마다 컴파일 저장할 때 한 번 컴파일
공유 공유 불가 공유하여 사용 가능
다른 응용 프로그램에서의
호출 가능 여부
X O

 

■ 저장 서브 프로그램의 대표적인 구현 방식과 용도

서브 프로그램 용도
프로시저 일반적으로 특정 처리 작업 수행을 위한 서브프로그램. SQL문에서는 사용할 수 X
함수 일반적으로 특정 연산을 거친 결과 값을 반환하는 서브프로그램. SQL문에서 사용 가능
패키지 저장 서브프로그램을 그룹화하는 데 사용
트리거 특정 상황(이벤트)이 발생했을 때 자동으로 연달아 수행할 기능을 구현하는데 사용


저장 프로시저 (stored procedure)

 

프로시저는 특정 처리 작업을 수행하는 데 사용하는 저장 서브 프로그램으로 파라미터는 용도에 따라 지정하거나 지정하지 않을 수 있다.

 

1. 파라미터가 없는 프로시저

작업 수행에 입력 데이터가 필요하지 않을 경우 사용

 

1
2
3
4
5
6
7
8
CREATE [OR REPLACE] PROCEDURE [프로시저 이름]
IS|AS
    [선언부]
BEGIN
    [실행부]
EXCEPTION
    [예외 처리부]
END    [프로시저 이름];
cs

 

OR REPLACE (선택) : 지정한 이름을 가진 프로시저가 이미 존재하면 현재 작성한 내용으로 대체(덮어 씌우기)

IS | AS : 선언부를 시작하기 위해 IS나 AS 사용. 선언부가 존재하지 않더라도 반드시 명시해야 하며 DECLARE 키워드는 사용 X

EXCEPTION (선택) : 예외를 처리하기 위한 예외처리부

END [프로시저 이름] : 프로시저 생성의 종료를 의미. 프로시저 이름 생략 가능

 

2. 파라미터를 사용하는 프로시저

입력 데이터가 필요한 경우 파라미터를 정의. 여러 개 작성 가능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE [OR REPLACE] PROCEDURE [프로시저 이름]
 
[(파라미터 이름1 [modes] 자료형 [ := || DEFAULT 기본값],
  파라미터 이름2 [modes] 자료형 [ := || DEFAULT 기본값],
  ...
  파라미터 이름N [modes] 자료형 [ := || DEFAULT 기본값]
)]
IS|AS
    [선언부]
BEGIN
    [실행부]
EXCEPTION
    [예외 처리부]
END    [프로시저 이름];
cs

 

[파라미터 이름 ~ ] : 실행에 필요한 파라미터 정의. 여러 개일 경우 쉼표(,)로 구분하여 지정. 기본값과 modes는 생략가능

[파라미터의 모드]

  1. IN : 프로시저를 호출할 때 값을 입력 받음 (지정하지 않으면 기본 값)
  2. OUT : 호출할 때 값을 반환
  3. IN OUT : 호출할 때 값을 입력 받은 후 실행 결과 값을 반환

 

■ 프로시저 오류 정보 확인

프로시저를 생성할 때 발생하는 오류를 확인할 수있는 방법 2가지

  1. SHOW ERRORS(ERR) : 가장 최근에 생성되거나 변경된 서브 프로그램의 오류 정보를 출력
  2. USER_ERRORS : 오류 정보를 확인할 수 있는 데이터 사전

 

■ 함수 (function)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE [OR REPLACE] FUNCTION [함수 이름]
 
[(파라미터 이름1 [IN] 자료형 1,
  파라미터 이름2 [IN] 자료형 2,
  ...
  파라미터 이름N [IN] 자료형 N
)]
RETURN [자료형]
IS|AS
    [선언부]
BEGIN
    [실행부]
    RETURN (반환 값);
EXCEPTION
    [예외 처리부]
END    [ 이름];
cs

 

[파라미터 이름 ~ ] (선택) : 함수 실행에 사용할 입력 값이 필요하면 파라미터를 지정. 필요에 따라 여러 개 정의 가능. 프로시저와 달리 IN모드만 지정 가능

RETURN [자료형] : 함수의 실행 후 반환값의 자료형을 정의

RETURN (반환 값) : 함수의 반환값을 지정

 

■ 함수와 프로시저의 차이점

특징 프로시저 함수
실행 EXECUTE 명령어 또는 다른 PL/SQL 서브 프로그램 내에서 호출하여 실행 변수를 사용한 EXECUTE 명령어 또는 다른 PL/SQL 서브 프로그램에서 호출하여 실행하거나 SQL문에서 직접 실행 가능
파라미터 지정 필요에 따라 지정하지 않을 수도 있고 여러 개 지정할 수도 있으며 IN, OUT, IN OUT 세 가지 모드 사용 가능 프로시저와 같게 지정하지 않을 수도 있고 여러개 지정할 수도 있지만 IN모드(또는 생략)만 가능
값의 반환 실행 후 값의 반환이 없을 수도 있고, OUT, IN OUT 모드의 파라미터 수에 따라 여러 개 값을 반환 가능 반드시 하나의 값만 반환해야 하며 값의 반환은 프로시저와 달리 OUT, IN OUT모드의 파라미터를 사용하는 것이 아니라 RETURN 절과 RETURN 문을 통해 반환

 

■ 커서 (CURSOR)

 

커서란 특정 SQL  문장을 처리한 결과를 담고있는 메모리 영역을 가리키는 일종의 포인터이다. 커서의 종류에는 묵시적 커서와 명시적 커서가있다.  묵시적 커서는 오라클 내부에서 자동으로 생성되어 SQL문장이 실행될 때마다 자동으로 만들어져 실행되는 커서이고 명시적 커서는 사용자가 직접 정의해서 사용하는 커서이다.

 

 

뷰(VIEW)란?

  • 뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다.
  • 뷰는 복잡한 쿼리를 단순화 시킬 수 있다.
  • 뷰는 사용자에게 필요한 정보만 접근하도록 접근을 제한할 수 있다.

뷰(VIEW) 생성

1
2
3
4
5
6
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 뷰이름(사용자정의) 
   [(column_aliases)]
AS 
    SELECT 문 
    [WITH READ ONLY]
    [WITH CHECK OPTION [CONSTRAINT 제약조건명]]
cs
 

OR REPLACE : 해당 구문을 사용하면 뷰를 수정할 때 DROP 없이 수정이 가능하다.

FORCE : 뷰를 생성할 때 쿼리문의 테이블, 컬럼, 함수 등이 존재하지 않아도 생성이 가능하다.

NORORCE : 뷰를 생성할 때 쿼리문의 테이블, 컬럼 함수 등이 존재하지 않으면 생성되지 않는다.

column_aliases : SELECT 컬럼의 별칭을 미리 정의할 수 있다.

WITH READ ONLY : SELECT 만 가능하다. (INSERT, UPDATE, DELETE 불가능)

WITH CHECK OPTION : WHERE 절의 조건에 해당하는 데이터만 저장, 변경이 가능하다.

 

뷰(VIEW) 삭제

1
DROP VIEW 뷰이름(사용자정의) 
cs

 


뷰(VIEW)의 특징

  1. 뷰는 데이터의 논리적 독립성을 제공할 수 있다.
  2. 뷰는 가상 테이블이기 때문에 물리적으로 구현되어 있지 않다.
  3. 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하다.
  4. 뷰에 나타나지 않은 데이터를 안전하게 보호할 수 있다.
  5. 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있다.
  6. 뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제된다.

 

뷰(VIEW)의 장점

  1. 논리적 데이터 독립성 제공
  2. 동일 데이터에 대해 동시에 여러 사용자의 상이한 응용이나 요구를 지원
  3. 사용자의 데이터 관리를 간단하게 해줌
  4. 접근 제어를 통한 자동 보안이 제공 

 

뷰(VIEW)의 단점

  1. 독립적 인덱스를 가질 수 없음
  2. ALTER VIEW문을 사용할 수 없음 (뷰의 정의를 변경할 수 없음)
  3. 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따름

 

 

+ Recent posts