Oracle 트리거 와 커서 빠 른 학습

8817 단어 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;
/
在这里插入图片描述
오 라 클 트리거 와 커서 연습 문제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 오 라 클 트리거 와 커서 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기