《数据库系统概论》实验报告书 安徽工业大学计算机学院
BEGIN
SELECT COUNT(*) INTO N FROM STUDENT; END; /
SET SERVEROUTPUT ON; DECLARE SCOUNT NUMBER; BEGIN
STU_COUNT(SCOUNT);
DBMS_OUTPUT.PUT_LINE('SCOUNT='||SCOUNT); END; /
EXECUTE STU_COUNT;
例7-2: (存储过程) 创建显示学生信息的存储过程STUDENT_LIST,并引用STU_COUNT存储过程。
CTEATE OR REPLACE PROCEDURE STUDENT_LIST AS
P1 STUDENT.SNO%TYPE; P2 STUDENT.SNAME%TYPE; P3 STUDENT.SDEPT%TYPE; P4 STUDENT.SCLASS%TYPE; P5 STUDENT.SAGE%TYPE; P6 STUDENT.SSEX%TYPE; N NUMBER(2);
30/19
《数据库系统概论》实验报告书 安徽工业大学计算机学院
CURSOR C_S IS SELECT * FROM STUDENT; BEGIN OPEN C_S; STU_COUNT(N); FOR I IN 1..N LOOP
FETCH C_S INTO P1,P2,P3,P4,P5,P6;
DBMS_OUTPUT.PUT_LINE('SNO:'||p1||’ SNAME:’||p2||’ SDEPT:’||p3|| 'SCLASS:'||p4||’ SSEX:’||p5||’ SAGE:’||p6); END LOOP; END; /
EXECUTE STUDENT_LIST;
例7-3: (存储过程) 创建一个显示学生平均成绩的存储过程。 CREATE OR REPLACE PROCEDURE STU_SAVG(V_SNO IN STUDENT.SNO%TYPE) AS
V_SNAME STUDENT.SNAME%TYPE; V_AVG NUMBER(5,2); C BEGIN
SELECT AVG(SCORE) INTO V_AVG FROM SCORE WHERE SNO=V_SNO; SELECT SNAME INTO V_SNAME FROM STUDENT WHERE SNO=V_SNO;
DBMS_OUTPUT.PUT_LINE('SNAME:'||V_SNAME||' '||'AVG_SCORE:'||V_AVG); END; /
EXECUTE STU_SAVG('97001');
例7-4: (存储过程) 创建显示所有学生平均成绩的存储过程。 CREATE OR REPLACE PROCEDURE SCORE_AVG AS
SAVG NUMBER(7,3);
31/19
《数据库系统概论》实验报告书 安徽工业大学计算机学院
BEGIN
SELECT AVG(SCORE) INTO SAVG FROM SCORE; DBMS_OUTPUT.PUT_LINE('SAVG ='|| SAVG); END; /
SET SERVEROUTPUT ON; EXECUTE SCORE_AVG;
例7-5: (修改数据库表) 在Student表中增加SAVG(N,6,2) 字段。 ALTER TABLE STUDENT ADD SAVG NUMBER(6,2);
例7-6: (存储过程) 创建存储过程,计算每个学生的平均成绩保存到学生表SAVG字段中。
create or replace procedure EVERYSTU_AVG as
v_no STUDENT.SNO%TYPE; v_name Student.SNAME%type; v_dept Student.SDEPT%type; v_class Student.SCLASS%type; v_age Student.SAGE%type; v_sex Student.SSEX%type; v_avg Student.SAVG%type;
32/19
《数据库系统概论》实验报告书 安徽工业大学计算机学院
m number(2);
cursor C_ADD is select * from Student; begin
STU_COUNT(m); OPEN C_ADD; FOR i IN 1..m LOOP
FETCH C_ADD INTO v_no,v_name,v_dept,v_class,v_age,v_sex,v_avg;
dbms_output.put_line('SNO:'|| v_no ||' SNAME:'||v_name||' SDEPT:'||v_dept|| ' SCLASS:'||v_class||' SAGE:'||v_age||' SSEX:'||v_sex||' SAVG:'||v_avg); END LOOP; END;
/
[ 实验要求 ]
① 创建、调试和修改、调用和执行Oracle存储过程; ② 创建、调试和修改、测试Oracle触发器。 [ 实验方法 ]
① 将实验需求用SQL语句表示;
② 执行SQL语句;
③ 查看执行结果,如果结果不正确,进行修改,直到正确为止。 ②
[ 实验总结 ]
本次实验学习使用存储过程和触发器。在学习此内容之前,我学习了PL/SQL语言,掌握了基本的语言用法后才能进行存储过程和触发器的编写。在一开始用存储过程输出结果时,却发现没有内容显示,后来才发现在使用dbms_output之前需要使用set serverout on打开serveroutput开关。存储过程的执行可以用直接执行的方法,例如:execute 过程名;或者利用其他过程调用。有关于数据库实验的心得体会,总的来说,受益匪浅。在这些天中,我们学到了很多东西,包括建表,导入数据,查询,插入。最重要的是我们有机会用电脑自己进行实践,没接触的时候总是觉得它比较深奥或是不可接近的新型语言,尽管自己对C语言非常感兴趣,但还是有些心理上的陌生感.通过学习还是学到了好多东西.
33/19