--시스템계정에 선언할것!
grant create view to 아이디명;
commit;
create view emp_gender
as select emp_name, emp_no, decode(substr(emp_no,8,1),1,'남',3,'남','여')"성별" from employee;
--가상테이블 생성
select * from emp_gender
where "성별"='여';
--생성한 테이블 조회
보여주고싶지 않은 정보를 감출때
기본적으로 view는 dml이 가능하지만 아래의 경우에는 불가능함
or replace
create view emp_join_info
as select emp_name, dept_title from employee left join department on dept_code = dept_id;
--생성완료
create or replace view emp_join_info
as select emp_name, dept_title, phone from employee left join department on dept_code = dept_id;
--phone을 추가하면 테이블을 지우고 phone을 추가해서 다시 생성해줌
force/noforce
force옵션은 기본 테이블이 존재하지 않더라도 뷰를 생성함
noforce는 기본테이블이 없으면 생성하지 않음
create force view emp_view
as select emp_id, emp_name, salary from nono;
select * from emp_view;
-- 없는 표를 가지고와서 강제로 생성은 가능하지만 실제로 조회해보면 오류가 뜸
with check option
create or replace view emp_view_D5
as select emp_id, emp_name, salary, dept_code from employee
where dept_code = 'D5' **with check option**;
-- dept_code 칼럼 수정불가코드
update emp_view_D5 set dept_code='D2'
where salary >= 2500000;
--D2로 수정요청
-- 오류
ORA-01402: view WITH CHECK OPTION where-clause violation
with read only
create or replace view emp_view_D5
as select emp_id, emp_name, salary, dept_code from employee
where dept_code = 'D5' **with read only**;
--수정 삭제 불가 코드
update emp_view_d5 set salary = salary+500000;
--salary 추가요청
--오류
SQL 오류: ORA-42399: cannot perform a DML operation on a read-only view
42399.0000 - "cannot perform a DML operation on a read-only view"
user_xxxx
all_xxxx
DBA_XXXX
create sequence seQ_user_no
start with 1 --생략가능
increment by 1 -- 생략가능
maxvalue 10000 --nomaxvalue, 생략가능
cycle --nochycle --생략가능
nocache;
create sequence seq_user_no2
start with 1
increment by 1
nomaxvalue
nocycle
nocache;
INSERT INTO SHOP_MEMBER
VALUES(seq_user_no.nextval, 'user01', 'pass01', '01000000000', 'user01@iei.or.kr');
INSERT INTO SHOP_MEMBER
VALUES(SEQ_USER_NO.NEXTVAL, 'user02', 'pass02', '010000004', 'user02@iei.or.kr');
INSERT INTO SHOP_MEMBER
VALUES(SEQ_USER_NO.NEXTVAL, 'user03', 'pass03', '010000000', 'user03@iei.or.kr');
INSERT INTO SHOP_MEMBER
VALUES(SEQ_USER_NO.NEXTVAL, 'user04', 'pass04', '01000000000', 'user03@iei.or.kr');
values(시퀀스명.nextval,밸류값..)을하면 시퀀스가 1씩 증가한다
하지만 입력에 실패했을대도 시퀀스값은 상승했기때문에 실패시에도 1이 카운팅된다.
select seq_user_no.currval from dual;
--현재 시퀀스 값 확인
-- 해당 시퀀스의 다음값
SELECT testSeq.NEXTVAL FROM DUAL;
-- 해당 시퀀스의 현재값
SELECT testSeq.CURRVAL FROM DUAL;
--INSERT에서의 시퀀스 다음값
INSERT INTO oracleStudy VALUES(testSeq.NEXTVAL, 'studyName' , 'class' , A);
-- 시퀀스 생성
CREATE SEQUENCE SEQ_USER_NO
START WITH 1 -- 생략가능
INCREMENT BY 1 -- 생략가능
NOMAXVALUE -- 생략가능
NOCYCLE -- 생략가능
NOCACHE; -- 생략가능
CREATE SEQUENCE SEQ_USER_NO; -- 기본값으로 생성됨
-- 시퀀스 확인
SELECT * FROM USER_SEQUENCES;
-- 시퀀스 이용 데이터 삽입
INSERT INTO SHOP_MEMBERVALUES
(SEQ_USER_NO.NEXTVAL, 'khuser01', 'pass01', '01092928383', 'khuser01@iei.or.kr'
);
INSERT INTO SHOP_MEMBERVALUES(SEQ_USER_NO.NEXTVAL,
'khuser02', 'pass02', '01082830494', 'khuser02@iei.or.kr');
INSERT INTO SHOP_MEMBERVALUES(SEQ_USER_NO.NEXTVAL, 'khuser03', 'pass03',
'01092983939', 'khuser03@iei.or.kr');
INSERT INTO SHOP_MEMBERVALUES(SEQ_USER_NO.NEXTVAL, 'khuser04',
'pass04', '01092444939', 'khuser04@iei.or.kr');
-- 시퀀스 현재값 조회
SELECT SEQ_USER_NO.CURRVAL FROM DUAL;
-- INSERT 오류가 나더라도 시퀀스의 값은 증가함
-- 해당 시퀀스의 현재값을 조회하기 위해 CURRVAL을 사용해야함
-- 시퀀스 수정ALTER SEQUENCE SEQ_USER_NOINCREMENT BY 10;
-- 시퀀스 증가폭 수정-- 시퀀스 삭제DROP SEQUENCE SEQ_USER_NO;
-- 초기값은 수정이 안되기 때문에 지웠다가 다시 만들어야함
색인
sql명령문의 처리 속도를 향상 시키기 위해서 컬럼에 대해 생성하는 오라클 객체!!!!
key-value형태로 생성이 되며 key에는 인덱스로 만들 컬럼 값 value에는 행이 저장된 주소 값이 저장됨
장점: 검색 속도가 빨라지고 시스템에 걸리는 부하를 줄여서 시스템 전체 성능을 향상 시킬 수 있음
단점 :
어떤 컬럼에 인덱스를 만들면 좋을까?
효율적인 인덱스 사용 예
비 효율적인 인덱스 사용 예
인덱스 조회
select * from user_indexes
where table_name = 'employee';
create index index_1 on employee(emp_id, emp_no);
--인덱스는 컬럼에 건다
drop index inx_emp_name;
GRANT CONNECT, RESOURCE TO KH; -- 지금 부여했던 것은 ROLE 객체를 통해 권한을 부여했던것
CREATE ROLE EMP_ROLE;
-- 나만의 ROLE객체를 만들어서
--EMP_ROLE이라는 ROLE객체 생성
GRANT SELECT ON KH.EMPLOYEE TO EMP_ROLE;
-- 해당 ROLE객체에 권한을 부여하고
--EMP_ROLE에 KH.EMPLOYEE를 SELECT할수있는 권한을 부여
GRANT EMP_ROLE TO KHUSER;
-- 나만의 ROLE을 사용자 계정에 권한부여를 해봄.
-- EMP_ROLE을 KHUSER에 부여
REVOKE EMP_ROLE FROM KHUSER;
--KHUSER에게 주었던 EMP_ROLE의 권한을 삭제