Oracle數據庫基本操作五——存儲過程與觸發器


 

4. 存儲過程與觸發器:

例7-1: (存儲過程) 創建一個顯示學生總人數的存儲過程。

set serveroutput on
create or replace procedure student_count
as 
p1 number(3);
begin
select count(*) into p1 from student;
dbms_output.put_line('學生總人數是:'||p1);
end;
/
execute student_count();

例7-2: (存儲過程) 創建顯示學生信息的存儲過程STUDENT_LIST,並引用STU_COUNT存儲過程。

set serveroutput on;
create or replace procedure student_list
ascursor select_hand is/*定義游標方便使用*/
select sno,rtrim(sname) as sname,ssex,sage,sdept,sclass from student;
begin
    for i in  select_hand  loop
    dbms_output.put_line(i.sno||' '||i.sname||' '||i.ssex||' '||i.sage||' '
    ||i.sdept||' '||i.sclass); end loop; STUDENT_COUNT(); end; / execute student_list();

例7-3: (存儲過程) 創建一個顯示學生平均成績的存儲過程。

set serveroutput on;

create or replace procedure student_avgs
(no in student.sno%type)
as
avgs1 number(3,1);
begin
select avg(score) into avgs1 from score group by sno having sno = no ;
dbms_output.put_line('學號為:'||no||' 的平均成績是:'|| avgs1);
end;
/
execute student_avgs('96002');

例7-4: (存儲過程) 創建顯示所有學生平均成績的存儲過程。

set serveroutput on
create or replace procedure student_avgs
as
cursor  calcu_avgs is 
select sno,avg(sno) as avgs from score group by sno;
begin
for i in calcu_avgs loop
dbms_output.put_line('學號為:'||i.sno||' 的平均成績是:'|| i.avgs);
end loop;
end;
/
execute student_avgs();

例7-5: (修改數據庫表) 在Student表中增加SAVG(N,6,2) 字段。

alter table student add savg number(6,2);

例7-6: (存儲過程) 創建存儲過程,計算每個學生的平均成績保存到學生表SAVG字段中。

set serveroutput on
create or replace procedure save_savg
as
cursor calcu_avgs is 
select sno, avg(sno) as ag from score group by sno;
begin
for i in calcu_avgs loop
update student set savg = i.ag where sno = i.sno;
end loop;
end;
/
execute save_savg();

 

例7-7: (觸發器) 當更新學生成績表SCORE中的學生成績時,自動計算該學生的平均成績保存到學生表SAVG字段中。

create or replace trigger TSTU_UPA
after update or delete or insert on score
referencing new as new old as old for each row
begin
if updating or inserting then
update student set savg=-1 where sno=:new.sno;
end if;
if deleting then
update student set savg=-1 where sno=:old.sno;
end if;
end;
/
create or replace trigger TSTU_UPS
after update or delete or insert on student
declare
ssno char(5);
ssavg number(6,1);
begin
select sno into ssno from student where savg=-1;
select avg(score) into ssavg from score group by sno having sno=ssno;
if updating or inserting then
update student set savg=ssavg where sno=ssno;
end if;
if deleting then
update student set savg=ssavg where sno=ssno;
end if;
end;

 

例7-8: (觸發器) 創建包含插入、刪除、修改多種觸發事件的觸發器DML_LOG,對SCORE表的操作進行記錄。用INSERTING、DELETING、UPDATING謂詞來區別不同的DML操作。

先創建事件記錄表LOGS,該表用來對操作進行記錄。該表的字段含義解釋如下:

    LOG_ID:操作記錄的編號,數值型,它是該表的主鍵,自動增1,可由序列自動生成。

    LOG_TABLE:進行操作的表名,字符型,非空,該表設計成可以由多個觸發器共享使用。比如我們可以為Student表創建類似的觸發器,同樣將操作記錄到該表。

    LOG_DML:操作的動作,即INSERT、DELETE或UPDATE三種之一。

    LOG_KEY_ID:操作時表的主鍵值,數值型。之所以記錄表的主鍵,是因為主鍵是表的記錄的惟一標識,可以識別是對哪一條記錄進行了操作。對於Score表,主鍵是由SNO_CNO構成。

    LOG_DATE:操作的日期,日期型,取當前的系統時間。

    LOG_USER:操作者,字符型,取當時的操作者賬戶名。比如登錄SCOTT賬戶進行操作,在該字段中,記錄賬戶名為SCOTT。

set serveroutput on;
create table logs(
log_id number primary key,
log_table varchar2(30),
log_dml char(10),
log_key_id varchar2(30),
log_date date,
log_user char(30) );
create sequence log_id;
create or replace trigger sc_logs after insert or delete or update on score
referencing new as new old as old for each row
declare
tlog_id logs.log_id%type;
tlog_table logs.log_table%type;
tlog_dml logs.log_dml%type;
tlog_key_id logs.log_key_id%type;
tlog_date logs.log_date%type;
tlog_user logs.log_user%type;
begin
select max(logs.log_id) into tlog_id from logs;
tlog_table := 'score';
tlog_date := sysdate;
tlog_user := user;
if inserting then
tlog_dml := 'insert';
tlog_key_id:=:old.rowid;
insert into logs values(log_id.nextval, tlog_table, tlog_dml, tlog_key_id, tlog_date, tlog_user);
end if;
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM