본문 바로가기

오라클

오라클 VIEW 뷰

  -- 뷰 : 존재하는 하나이상의 테이블에서 사용자가 얻기 위하는 데이터들만을 편리하게 가져오기 위해 사전에 원하는 컬럼들 만을 모아서 만들어 놓은 가상의 뷰

보통 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