Oracle 트리거 와 커서 빠 른 학습
1.사용자 작업 을 기록 하 는 트리거 만 들 기
dept 만 들 기log 데이터 시트,두 필드 정의(operatetag varchar2(10),operate_time date)는 각각 작업 종류(삽입,수정,삭제)정보 와 작업 날 짜 를 저장 하 는 데 사 용 됩 니 다.그리고 dept 표 에 대한 구문 급 트리거 tridept,dept 표 에 대한 사용자 의 조작 정 보 를 dept 에 저장 합 니 다.tag 표 중.
dept 표 에서 어느 부 서 를 삭제 할 때 이 트리거 는 emp 표 에서 이 부서 의 모든 직원 을 삭제 합 니 다.
--
create table dept_log(
operate_tag varchar2(10),
operate_time date
);
create table dept(
dname varchar2(20),
dno number
);
--
create or replace trigger tri_dept
before insert or update or delete
on dept
declare
v_tag varchar2(10);
begin
if inserting then
v_tag:=' ';
elsif updating then
v_tag:=' ';
elsif deleting then
v_tag:=' ';
end if;
insert into dept_log values(v_tag, sysdate);
end tri_dept;
/
2.부 서 를 삭제 할 때 이 부서 의 모든 직원 의 트리거 를 삭제 합 니 다.
dept 표 에서 어느 부 서 를 삭제 할 때 이 트리거 는 emp 표 에서 이 부서 의 모든 직원 을 삭제 합 니 다.
메모:sysdba 로 로그 인 한 모든 계 정 은 트리거 를 만 들 수 없 기 때문에 만 든 사용자 아래 에 트리거 를 만들어 야 합 니 다.
--
create table dept(
deptno number not null,
dname varchar(20) not null
);
--
create table emp(
emp_no number not null,
emp_name varchar(20) not null,
job varchar(20) not null,
sal number not null,
deptno number not null
);
--
insert into dept values(10, ' 1');
insert into dept values(20, ' 2');
insert into emp values(1001, ' 1', ' 1', 5000, 10);
insert into emp values(1002, ' 2', ' 2', 7200, 10);
insert into emp values(1003, ' 3', ' 3', 6000, 10);
insert into emp values(1004, ' 4', ' 4', 5000, 20);
insert into emp values(1005, ' 5', ' 5', 7000, 20);
--
create or replace trigger del_dept
before delete on dept
for each row
begin
delete from emp where deptno = :old.deptno;
end;
/
3.account 표 에 기록 을 삽입 한 후 my event 데이터 시트 를 업데이트 하 는 트리거 를 만 듭 니 다.
TRIG 를 만 들 었 습 니 다.INSERT 의 트리거 는 표 account 에 데 이 터 를 삽입 한 후에 표 my event 에 데 이 터 를 삽입 합 니 다(표 구 조 는 만 들 지 않 습 니 다..)
create or replace trigger trig_insert
after insert
on account
begin
if inserting then
insert into myevent values(1, 'after insert');
end if;
end;
/
4.DBA 에 로그 인 한 사용자 의 사용자 이름과 시간 을 기록 하 는 트리거 를 만 듭 니 다.DBA 로 데이터베이스 에 로그 인하 고 db 라 는 이름 을 만 듭 니 다.로그 인 사용자 의 사용자 이름과 시간 을 기록 하 는 데 사용 되 는 데이터 시트 입 니 다.
이 어 데이터베이스 시작 과 데이터 베 이 스 를 각각 만 들 고 트리거 를 닫 고 db로그 데이터 시트 에 기록 을 삽입 하여 로그 인 사용자 의 사용자 이름과 작업 시간 을 저장 합 니 다.
--
create table db_log(
name varchar2(20),
rtime timestamp
);
-- ,
create or replace trigger trigger_startup
after startup
on database
begin
insert into db_log values('user', sysdate);
end;
/
-- ,
create or replace trigger trigger_shutdown
before shutdown
on database
begin
insert into db_log values('xiuyan', sysdate);
end;
/
커서:다음 문 제 는 부서 표 와 직원 표를 바탕 으로 한다.
--
create table emp(
empno number,
ename varchar2(20),
job varchar2(20),
sal number,
deptno number);
create table dept(
deptno number,
dname varchar2(20),
loc varchar2(20));
--
insert into dept values(10,'account','new york');
insert into dept values(20,'salesman','chicago');
insert into dept values(30,'research','dallas');
insert into dept values(40,'operations','boston');
insert into emp values(1001,'mary','account',5000,10);
insert into emp values(2001,'smith','salesman',6000,20);
insert into emp values(3001,'kate','research',7000,30);
1.암시 적 커서 와 for 문 구 를 사용 하여 직무 가 판매원(salesman)의 직원 정 보 를 검색 하고 출력 합 니 다.
begin
for emp_record in(select empno, ename, sal from emp where job='salesman')
loop
dbms_output.put(' :'||emp_record.empno);
dbms_output.put('; :'||emp_record.ename);
dbms_output.put_line('; :'||emp_record.sal);
end loop;
end;
/
2.직원 월급 20%인상
emp 표 에서 판매원(즉 salesman)의 임금 을 20%올 린 다음 에 암시 적 커서 SQL 의%ROWCOUNT 속성 수출 로 임금 을 올 린 직원 수 를 사용 합 니 다.
begin
update emp set sal=sal*(1+0.2) where job='salesman';
if sql%notfound then
dbms_output.put_line(' ');
else
dbms_output.put_line(' '|| sql%rowcount ||' ');
end if;
end;
/
3.커서 와 for 문 구 를 표시 하여 부서 번호 가 30 인 직원 정 보 를 검색 하고 출력 합 니 다.
declare
cursor cur_emp is
select * from emp where deptno = 30;
begin
for emp_record in cur_emp
loop
dbms_output.put(' :'||emp_record.empno);
dbms_output.put('; :'||emp_record.ename);
dbms_output.put_line('; :'||emp_record.job);
end loop;
end;
/
4.커서 가 직원 정 보 를 검색 하고%FOUND 속성 을 사용 하여 판단
직원 번 호 를 지정 한 직원 정 보 를 검색 한 다음 에 지정 한 직원 번호 의 직원 정 보 를 검색 할 지 여 부 를 판단 하기 위해 커서 의%FOUND 속성 을 사용 합 니 다.
declare
v_ename varchar2(50);
v_job varchar2(50);
cursor cur_emp is
select ename, job from emp where empno = &empno;
begin
open cur_emp;
fetch cur_emp into v_ename, v_job;
if cur_emp%found then
dbms_output.put(' :'||v_ename ||', :'||v_job );
else
dbms_output.put(' ');
end if;
end;
/
5.커서 를 만 들 고 데이터 이전 을 완료 하 며 fruit 표 의 단가 가 10 이상 인 기록 을 fruitage 표 에 넣 습 니 다.
fruit 표를 만 들 고 데 이 터 를 삽입 합 니 다.
--
create table fruit(
f_id varchar2(10) not null,
f_name varchar2(255) not null,
f_price number (8,2) not null
);
--
insert into fruit values ('a1', 'apple',5.2);
insert into fruit values ('b1','blackberry', 10.2);
insert into fruit values ('bs1','orange', 11.2);
insert into fruit values('bs2','melon',8.2);
insert into fruit values ('t1','banana', 10.3);
insert into fruit values ('t2','grape', 5.3);
insert into fruit values ('o2','coconut', 9.2);
표 fruitage 를 만 들 고 표 fruitage 와 표 fruit 의 필드 가 일치 하 며 다음 문 구 를 이용 하여 만 듭 니 다.
create table fruitage as select * from fruit where 2=3;
-- WHERE , 。
-- 。
커서 를 만 들 고 데이터 이전 을 완료 하 며 fruit 표 에서 단가 가 10 이상 인 기록 을 fruitage 표 에 넣 습 니 다.
declare
v_id fruit.f_id %TYPE;
v_name fruit.f_name %TYPE;
v_price fruit.f_price %TYPE;
cursor frt_cur is
select f_id, f_name, f_price from fruit where f_price>10;
begin
open frt_cur;
loop
fetch frt_cur into v_id, v_name, v_price;
if frt_cur%found then
insert into fruitage values(v_id, v_name, v_price);
else
dbms_output.put_line(' , '||frt_cur%ROWCOUNT||' ');
exit;
end if;
end loop;
close frt_cur;
end;
/
오 라 클 트리거 와 커서 연습 문제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 오 라 클 트리거 와 커서 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Oracle 생성 향후 3일간의 전체 시점 (단계 상세)수요: X 좌표축 시간은 모두 정시 시간으로 앞으로 3일 동안의 예측을 보여준다(x 축은 앞으로 3일 동안의 정시 시간을 보여준다), 3시간마다 한 눈금, 가로 좌표는 모두 24개의 눈금을 보여준다 1단계: 현재 시...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.