Oracle - Exp(4)_存储过程与触发器

1.索引与数据库完整性

  例1-1: (建立索引)  为Score表按课程号升序、分数降序建立索引,索引名为SC_GRADE。

  例1-2: (删除索引)  删除索引SC_GRADE。

例1-3: (修改数据库表)  添加成绩表Score的参照完整性约束关系,如存在则先删除再增加。

  例1-4: (修改数据库表)  删除成绩表Score的参照完整性约束关系。

2. 存储过程与触发器:

例2-1: (存储过程) 创建一个显示学生总人数的存储过程STU_COUNT。

例2-2: (存储过程) 创建显示学生信息的存储过程STUDENT_LIST。

例2-3: (存储过程) 创建一个显示学生平均成绩的存储过程。

例2-4: (存储过程) 创建显示所有学生平均成绩的存储过程。

例2-5:(存储过程) 创建一个对学生姓名进行模糊查找的带参存储过程。

例2-6: (触发器) 创建包含插入、删除、修改多种触发事件的触发器Trig_xs_kc,对student、course和score表进行参照完整性关系的维护。

  1. 当在score表中插入一条记录时,要检查其学号在student表中和课程号在course表中是否存在,若不存在则不允许插入。
  2. 对student表进行删除操作,则删除score表中对应学号的所有记录;对student表的学号进行更新操作,则更新score表中对应学号的所有记录;
  3. 对course表进行删除操作,则删除score表中对应课程号的所有记录;对course表的课程号进行更新操作,则更新score表中对应课程号的所有记录;


--例1-1: (建立索引)  为Score表按课程号升序、分数降序建立索引,索引名为SC_GRADE。
CREATE INDEX SC_GRADE ON SCORE(CNO ASC,SCORE DESC);

--例1-2: (删除索引)  删除索引SC_GRADE。
DROP INDEX SC_GRADE;

--例1-3: (修改数据库表)  添加成绩表Score的参照完整性约束关系,如存在则先删除再增加。
ALTER TABLE SCORE DROP CONSTRAINT FKS_CNO;
ALTER TABLE SCORE DROP CONSTRAINT FKS_SNO;
ALTER TABLE SCORE ADD CONSTRAINT FKS_SNO FOREIGN KEY(SNO) REFERENCES STUDENT(SNO);
ALTER TABLE SCORE ADD CONSTRAINT FKS_CNO FOREIGN KEY(CNO) REFERENCES COURSE(CNO);

--例1-4: (修改数据库表)  删除成绩表Score的参照完整性约束关系。
ALTER TABLE SCORE DROP CONSTRAINT FKS_CNO;
ALTER TABLE SCORE DROP CONSTRAINT FKS_SNO;



--例2-1: (存储过程) 创建一个显示学生总人数的存储过程STU_COUNT。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE STU_COUNT
AS
TOTAL NUMBER(4);
BEGIN
    SELECT COUNT(SNO) INTO TOTAL FROM STUDENT;
    DBMS_OUTPUT.PUT_LINE('学生总人数:'||total);
END;
/
EXECUTE STU_COUNT();




--例2-2: (存储过程) 创建显示学生信息的存储过程STUDENT_LIST。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE STUDENT_LIST
AS
CURSOR SELECT_INFO IS
SELECT * FROM STUDENT;
BEGIN
    FOR I IN SELECT_INFO LOOP
        DBMS_OUTPUT.PUT_LINE(I.SNO||' '||I.SNAME||' '||I.SDEPT||' '||I.SCLASS||' '||I.SSEX||' '||I.SAGE);
    END LOOP;
END;
/
EXECUTE STUDENT_LIST();


--例2-3: (存储过程) 创建一个显示学生平均成绩的存储过程。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE STU_AVG_SCORE
(S_NO IN STUDENT.SNO%TYPE)
AS
AVG_SCORE NUMBER(4,2);
BEGIN
    SELECT AVG(SCORE) INTO AVG_SCORE FROM SCORE GROUP BY SNO HAVING SNO=S_NO;
    DBMS_OUTPUT.PUT_LINE('学号:'||S_NO||' 平均成绩:'||AVG_SCORE);
END;
/

EXECUTE STU_AVG_SCORE('96001');

--例2-4: (存储过程) 创建显示所有学生平均成绩的存储过程。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE ALL_STU_AVG_SCORE
AS
CURSOR ALL_AVG IS
SELECT SNO,AVG(SCORE) AS 平均成绩 FROM SCORE GROUP BY SNO;
BEGIN
    FOR I IN ALL_AVG LOOP
        DBMS_OUTPUT.PUT_LINE('学号:'||I.SNO||' 平均成绩:'||I.平均成绩);
    END LOOP;
END;
/

EXECUTE ALL_STU_AVG_SCORE();

--例2-5:(存储过程) 创建一个对学生姓名进行模糊查找的带参存储过程。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE FIND_NAME
(S_NAME IN STUDENT.SNAME%TYPE)
AS
CURSOR XXX IS
SELECT SNAME FROM STUDENT WHERE SNAME LIKE '%'||S_NAME||'%';
BEGIN
FOR I IN XXX LOOP
    DBMS_OUTPUT.PUT_LINE(I.SNAME);
END LOOP;
END;
/

EXECUTE FIND_NAME('马');



--例2-6: (触发器) 创建包含插入、删除、修改多种触发事件的触发器Trig_xs_kc,对student、course和score表进行参照完整性关系的维护。
--(1)	当在score表中插入一条记录时,要检查其学号在student表中和课程号在course表中是否存在,若不存在则不允许插入。
--(2)	对student表进行删除操作,则删除score表中对应学号的所有记录;对student表的学号进行更新操作,则更新score表中对应学号的所有记录;
--(3)	对course表进行删除操作,则删除score表中对应课程号的所有记录;对course表的课程号进行更新操作,则更新score表中对应课程号的所有记录;
CREATE OR REPLACE TRIGGER TRIG_XS_KC AFTER INSERT ON SCORE
FOR EACH ROW
DECLARE
    X STUDENT.SNO%TYPE;
    Y COURSE.CNO%TYPE;
BEGIN
    SELECT SNO INTO X FROM STUDENT WHERE SNO = :NEW.SNO;
    SELECT CNO INTO y FROM COURSE WHERE CNO = :NEW.CNO;
    IF (X IS NULL AND Y IS NULL) THEN
        ROLLBACK;
    END IF;
END;
/
INSERT INTO SCORE VALUES('123','456',88);


CREATE OR REPLACE TRIGGER TRIG_XS_KC_1 AFTER UPDATE OR DELETE ON STUDENT
FOR EACH ROW
BEGIN
    IF DELETING THEN
        DELETE FROM SCORE WHERE SNO = :OLD.SNO;
    END IF;
    IF UPDATING THEN
        UPDATE SCORE SET SNO = :NEW.SNO WHERE SNO = :OLD.SNO;
    END IF;
END;
/
UPDATE STUDENT SET SNO='96006' WHERE SNO='96005';


CREATE OR REPLACE TRIGGER TRIG_XS_KC_2 AFTER UPDATE OR DELETE ON COURSE
FOR EACH ROW
BEGIN
    IF UPDATING THEN
        UPDATE SCORE SET CNO = :NEW.CNO WHERE CNO = :OLD.CNO;
        UPDATE TEACH SET CNO = :NEW.CNO WHERE CNO = :OLD.CNO;  --因为teach表和course表有约束关系,所以必须更新两个表
    END IF;
    IF DELETING THEN
        DELETE FROM SCORE WHERE CNO = :OLD.CNO;
        UPDATE TEACH SET CNO = :NEW.CNO WHERE CNO = :OLD.CNO;
    END IF;
END;
/
DELETE FROM COURSE WHERE CNO = '006';
UPDATE COURSE SET CNO = '010' WHERE CNO = '007';




 

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 书名:Oracle Database 11g完全参考手册 原价:158.00元 作者:罗尼(Kevin Loney) 出版社:清华大学出版社 出版日期:2010-06-01 ISBN:9787302221920 字数: 页码:1240 版次:1 装帧: 开本:16开 编辑推荐 《Oracle Database 11g完全参考手册》   安装Oracle Database ll g或从早期版本升级   创建数据库表、序列、索引、视图和用户账户   构造SQL语句、过程、查询和子查询   使用虚拟专用数据库和透明数据加密优化安全性   使用SQL*oader乘10racle Data Pump导入和导出数据   使用SQL重放、变更管理和缓存结果   使用闪回和自动撤消管理功能避免人为错误   构建和调整PL/SQL触发器、函数和程序包   使用Java、JDBC和XMIL开发数据库应用程序   使用Oracle实时应用群集(RAC)优化可用性和可扩展性 内容提要 《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,关系数据库。通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 第1部分 关键的数据库概念 第1章 OracleDatabase11g体系结构 1.1 数据库和实例 1.2 数据库技术 1.2.1 存储数据 1.2.2 数据保护 1.2.3 可编程的结构 1.3 选择体系结构和选项 第2章 安装OracleDatabase11g和创建数据库 2.1 许可证和安装选项 2.2 使用OUI安装Oracle软件 第3章 升级到OracleDatabase11g 3.1 选择升级方法 3.2 升级之前的准备 3.3 运行升级前信息工具(Pre-UpgraInformationTool) 3.4 使用数据库升级助手(DBIUA) 3.5 执行手动直接升级 3.6 使用Export与Import 3.6.1 使用哪个EXport和Import版本 3.6.2 进行升级 3.7 使用数据复制法 3.8 升级完成之后的工作 第4章 规划OracIe应用程序方法、风险和标准 4.1 协作方法 4.2 每个人都有“数据 4.3 熟悉的Oracle语言 4.3.1 存储信息的表 4.3.2 结构化查询语言 4.3.3 简单的Oracle查询 4.3.4 为什么称作“关系 4.4 一些通用的、常见的示例 4.5 风险所在 4.6 新视角的重要性 4.6.1 变化的环境 4.6.2 代码、缩写和命名标准 4.7 如何减少混淆 4.7.1 规范化 4.7.2 表和列的英文名称 4.7.3 数据中的英文单词 4.8 名称和数据中的大写 4.9 规范化名称 4.10 人性化和优秀的设计 4.10.1 理解应用程序的任务 4.10.2 任务概要 4.11 理解数据 4.11.1 原子数据模型 4.11.2 原子业务模型 4.11.3 业务模型 4.11.4 数据项 4.11.5 查询和报告 4.12 关于对象名称的规范化 4.12.1 级别名称完整性 4.12.2 外键 4.12.3 单数名称 4.12.4 简洁 4.12.5 对象名辞典 4.13 智能键和列值 4.14 建议 第Ⅱ部分 SQL和SQL*PIus 第5章 SQL中的基本语法 5.1 样式 5.2 创建NEWSPAJPER表 5.3 用SQL从表中选择数据 5.4 select、From、where和Orderby 5.5 逻辑和值 5.5.1 单值测试 5.5.2 值列表的简单测试 5.5.3 组合逻辑 5.6 wbLere的另一个用途:子查询 5.6.1 从子查询得到单值 5.6.2 从子查询得到值列表 5.7 组合表 5.8 创建视图 5.9 扩展视图 第6章 基本的SQL*Plus报表和命令 6.1 构建简单的报表 6.1.1 ①remarkl 6.1.2 ②setheadsep 6.1.3 ③ttitle和btitle 6.1.4 column 6.1.5 ④breakon 6.1.6 ⑨computeavg 6.1.7 ⑩setlinesize 6.1.8 setpagesize 6.1.9 setnewpage 6.1.10 ⑩spool 6.1.11 ⑥/**/ 6.1.1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值