insert into(select s_id, s_name, reg_date, major_id, tuition, discount, sex
from student
where dept_id = 120)
values(199, 'Jojo', to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_309', 3400, null, 'FEMALE');
from student
where dept_id = 120)
values(199, 'Jojo', to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_309', 3400, null, 'FEMALE');
위의 문장은 현재 Jojo 라는 학생의 정보를 새롭게 추가할 때 학과아이디(dept_id)가 120라는 값과 select 절에 명시한 컬럼 값을 설정하고 있다. 원래의 의도는 학과아이디(dept_id)값도 함께 추가하는 것이지만 실제 실행결과는 다르게 나온다. select 절에 학과아이디(dept_id)를 명시하지 않았기 때문에 dept_id=120이란 값은 추가되지 못하며 그 자리에는 다음 결과 처럼 널(null)값이 들어가게 된다.
select * from student;
S_ID SNAME DEPT_ID REG_DATE MAJOR_ID TUITION DISCOUNT SEX
101 Tom 30 31-JUL-99 STAT_101 8900 .1 MALE
102 Sean 60 17-ARP-89 IE_205 9300 MALE
107 Robert 140 28-JUN-99 MSTS_201 4500 MALE
………………………………………………………………………………………
178 Jerry 120 12-JUL-99 ART_106 22000 MALE
179 Park 60 05-JUL-98 IE_304 16500 .13 MALE
199 Jojo 07-JUN-99 ART_309 3400 FEMALE
S_ID SNAME DEPT_ID REG_DATE MAJOR_ID TUITION DISCOUNT SEX
101 Tom 30 31-JUL-99 STAT_101 8900 .1 MALE
102 Sean 60 17-ARP-89 IE_205 9300 MALE
107 Robert 140 28-JUN-99 MSTS_201 4500 MALE
………………………………………………………………………………………
178 Jerry 120 12-JUL-99 ART_106 22000 MALE
179 Park 60 05-JUL-98 IE_304 16500 .13 MALE
199 Jojo 07-JUN-99 ART_309 3400 FEMALE
이러한 실수를 미리 확인하고 보다 정확한 문장을 생성하기 위하여 다음과 같이 with check option을 사용하는 것이다.
insert into(select s_id, s_name, reg_date, major_id, tuition, discount, sex
from student
where dept_id = 120 WITH CHECK OPTION)
values(199, 'Jojo', to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_309', 3400, null, 'FEMALE');
from student
*
ERROR at line 2:
ORA-01402: view WITH CHECK OPTION where-clause violation
from student
where dept_id = 120 WITH CHECK OPTION)
values(199, 'Jojo', to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_309', 3400, null, 'FEMALE');
from student
*
ERROR at line 2:
ORA-01402: view WITH CHECK OPTION where-clause violation
이처럼 with check option을 사용하게 되면 select 절에 명시되지 않은 컬럼의 데이터를 추가하려는 경우 에러를 발생시키며 문장을 수정할 것을 요구하게 된다.
다음은 새롭게 수정된 문장이면 select 절에 학과아이디(dept_id)가 포함되어져 있는 것을 확인할 수 있다.
insert into(select s_id, s_name, dept_id,reg_date, major_id, tuition, discount, sex
from student
where dept_id = 120 WITH CHECK OPTION)
values(144, 'Koko', 120, to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_303', 3200, null, 'FEMALE');
from student
where dept_id = 120 WITH CHECK OPTION)
values(144, 'Koko', 120, to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_303', 3200, null, 'FEMALE');
select * from student;
S_ID SNAME DEPT_ID REG_DATE MAJOR_ID TUITION DISCOUNT SEX
101 Tom 30 31-JUL-99 STAT_101 8900 .1 MALE
102 Sean 60 17-ARP-89 IE_205 9300 MALE
107 Robert 140 28-JUN-99 MSTS_201 4500 MALE
………………………………………………………………………………………
178 Jerry 120 12-JUL-99 ART_106 22000 MALE
179 Park 60 05-JUL-98 IE_304 16500 .13 MALE
199 Jojo 07-JUL-99 ART_309 3400 FEMALE
144 Koko 120 07-JUN-99 ART_303 3200 FEMALE
S_ID SNAME DEPT_ID REG_DATE MAJOR_ID TUITION DISCOUNT SEX
101 Tom 30 31-JUL-99 STAT_101 8900 .1 MALE
102 Sean 60 17-ARP-89 IE_205 9300 MALE
107 Robert 140 28-JUN-99 MSTS_201 4500 MALE
………………………………………………………………………………………
178 Jerry 120 12-JUL-99 ART_106 22000 MALE
179 Park 60 05-JUL-98 IE_304 16500 .13 MALE
199 Jojo 07-JUL-99 ART_309 3400 FEMALE
144 Koko 120 07-JUN-99 ART_303 3200 FEMALE
'개인참고자료 > 오라클(데이터베이스)' 카테고리의 다른 글
복수 행 서브쿼리의 정의와 In, Any, All 연산자의 사용 (0) | 2008.08.27 |
---|---|
NULL관련 함수 (0) | 2008.08.27 |
단일 행 함수 - 기타 함수(CASE) (0) | 2008.07.20 |
단일 행 함수 - 문자 함수(LOWER 함수) (0) | 2008.07.20 |
단일 행 함수 - 숫자 함수(WIDTH_BUCKET 함수) (0) | 2008.07.20 |