-- 뷰 : 존재하는 하나이상의 테이블에서 사용자가 얻기 위하는 데이터들만을 편리하게 가져오기 위해 사전에 원하는 컬럼들 만을 모아서 만들어 놓은 가상의 뷰
보통 JOIN으로 SELECT문을 만들어 뷰를 사용하는것 같다.
형식
CREATE [OR REPLACE] VIEW 뷰이름
AS SELECT문;
OR REPLACE : 뷰이름의 뷰가 없으면 생성하고 있다면 수정함
뷰정보확인
SELECT view_name, text FROM user_views;
뷰삭제
DROP VIEW 뷰이름;
뷰는 RESOURCE 권한으로만은 작성이 불가능 하다.
사용자 권한 확인
SELECT * FROM USER_SYS_PRIVS;
-- 사용자의 권한을 수정할 수 있는 사용자 : SYS, SYSTEM
-- sys사용자 : 사용자에게 뷰를 만들수 있는 권한 부여
GRANT CREATE VIEW To 사용자이름;
GRANT CREATE VIEW To sky;
SELECT * FROM SYSTEM_pricilege_map;
--------------------------------------------------------------
-뷰 만들기
CREATE VIEW viewPan
AS
SELECT b.b_id, title, price, g.g_id, g_name, p_date, p_su,
p_su* price amt
FROM book b
JOIN panmai p ON b.b_id=p.b_id
JOIN danga d ON b.b_id=d.b_id
JOIN gogaek g ON g.g_id=p.g_id;
SELECT view_name, text FROM user_views;
SELECT * FROM viewPan;
--------------------------------------------------------------
-- 뷰 수정
-- 판매 데이타 쿼리를 뷰로 만듬
CREATE OR REPLACE VIEW viewPan
AS
SELECT b.b_id, title, price, g.g_id, g_name, p_date, p_su,
p_su* price amt
FROM book b
JOIN panmai p ON b.b_id=p.b_id
JOIN danga d ON b.b_id=d.b_id
JOIN gogaek g ON g.g_id=p.g_id;
-- 서점별 년간 판매금액 쿼리를 뷰로 만듬
CREATE OR REPLACE VIEW viewYear
AS
SELECT TO_CHAR(p_date,'YYYY') 년도, g.g_id, g_name, SUM(p_su*price) 년간판매금액
FROM gogaek g
JOIN panmai p ON g.g_id =p.g_id
JOIN danga d ON p.b_id=d.b_id
GROUP BY TO_CHAR(p_date,'YYYY'),g.g_id, g_name
ORDER BY 년도 DESC;
--------------------------------------------------------------
--뷰를 가지고 데이타 추가 해보기
-- 테이블 생성
CREATE TABLE testa(
id NUMBER(4) PRIMARY KEY
,name VARCHAR2(20) NOT NULL
,city VARCHAR2(20) NOT NULL
,memo VARCHAR2(100)
);
CREATE TABLE testb (
num NUMBER(4) PRIMARY KEY
,id NUMBER(4)
CONSTRAINT fk_testb_id
REFERENCES testa(id)
ON DELETE CASCADE
,score NUMBER(3)
);
--데이타 추가
INSERT INTO testa(id,name,city,memo) VALUES (1,'a','aa',NULL);
INSERT INTO testa(id,name,city,memo) VALUES (2,'b','bb',NULL);
INSERT INTO testa(id,name,city,memo) VALUES (3,'c','cc',NULL);
INSERT INTO testa(id,name,city,memo) VALUES (4,'d','dd',NULL);
INSERT INTO testb(num,id,score) VALUES (1,1,80);
INSERT INTO testb(num,id,score) VALUES (2,2,70);
INSERT INTO testb(num,id,score) VALUES (3,3,60);
INSERT INTO testb(num,id,score) VALUES (4,4,90);
COMMIT;
-- 뷰작성
CREATE OR REPLACE VIEW testview1
AS
SELECT a.id, num, name, city, memo, score
FROM testa a JOIN testb b
ON a.id=b.id;
CREATE OR REPLACE VIEW testview2
AS
SELECT id, name, city FROM testa;
SELECT * FROM testview2;
INSERT INTO testview1(id,num,city,memo,score) VALUES (5,5,'vv','vvv',100); --에러
--testview1은 테이블 2개를 조인해 놓은 상태인데 데이타 추가는 한번에 하나의 테이블만 데이터 추가할 수 있는 규칙 때문에 에러.
--위의 조건으로는 INSERT , UPDATE, DELETE 모두 불가능.
INSERT INTO testview2(id,name,city) VALUES (5,'vv','vvv');
-- 단순뷰(1개 테이블로된 뷰)는 제약조건을 위반하지 않으면 INSERT 가능
'오라클' 카테고리의 다른 글
오라클 SEQUENCE (0) | 2013.06.06 |
---|---|
머트리얼라이즈뷰 (0) | 2013.06.06 |
상관하위부 질의 (0) | 2013.06.06 |
프로시져의 SYS_REFCURSOR 예제 (0) | 2013.06.05 |
프로시져(Stored Procedure) (0) | 2013.06.04 |