《Oracle数据库》实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二Oracle数据库开发环境下PL/SQL编程(2学时)
【实验目的】
(1)掌握PL/SQL 的基本使用方法。
(2)在SQL*PLUS环境下运行PL/SQL的简单程序。
(3)应用PL/SQL 解决实际问题
【实验内容与步骤】
一、实验内容:
1、用PL/SQL实现:输入eno的值,显示emp表中对应记录的内容。
2、用PL/SQL完成:读入三个数,计算并输出它们的平均值及三个数的乘积。
3、对职工表emp中的雇员SCOTT提高奖金,若工种为MANAGER,则奖金提高其原来的20%;若工种为SALESMAN,则奖金提高其原来的15%;若工种为ANALYST,则奖金提高其原来的10%,
其它都按原来的7%提高。
4、用PL/SQL块实现下列操作
公司为每个职工增加奖金:若职工属于30号部门,则增加$150;若职工属于20号部门,
则增加$250;若职工属于10号部门,则增加$350。(提示:游标请自行阅读相关内容)
DECLARE
addcomm m%type;
CURSOR emp_cursor IS select deptno from emp;
BEGIN
FOR emprec IN emp_cursor LOOP
IF emprec.deptno=30 THEN addcomm:=150;
ELSIF emprec.deptno=20 THEN addcomm:=250;
ELSIF emprec.deptno=10 THEN addcomm:=350;
END IF;
Update emp
set comm=comm+ addcomm where deptno= emprec.deptno;
END LOOP;
COMMIT WORK;
END;
实验三PL/SQL触发器和存储过程(2学时)
【实验目的】
(1)了解触发器的类型。
(2)掌握PL/SQL触发器的使用方法。
(3)了解存储过程的使用方法。
(4)掌握存储过程的使用方法。
【实验内容】
实验内容:
1、编写一个数据库触发器,当任何时候某个部门从dept表中删除时,该触发器将从emp 表中删除该部门的所有雇员。(要求:emp表、dept表均为复制后的表)
CREATE OR REPLACE TRIGGER del_emp_deptno
BEFORE DELETE ON dept
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE deptno=:OLD.deptno;
END;
2、创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表。--创建测试表
CREATE TABLE test
(
t_id NUMBER(4),
t_name V ARCHAR2(20),
t_age NUMBER(2),
t_sex CHAR
);
--创建记录测试表
CREATE TABLE test_log
(
l_user V ARCHAR2(15),
l_type V ARCHAR2(15),
l_date V ARCHAR2(30)
);
--创建触发器
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDA TE ON test
DECLARE
v_type test_log.l_type%TYPE;
BEGIN
IF INSERTING THEN --INSERT触发
v_type := 'INSERT';
DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志'); ELSIF UPDATING THEN --UPDA TE触发
v_type := 'UPDATE';
DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志'); ELSIF DELETING THEN
v_type := 'DELETE';
DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志'); END IF;
INSERT INTO test_log V ALUES(user,v_type,
TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));
END;
/
--下面我们来分别执行DML语句
INSERT INTO test V ALUES(101,'zhao',22,'M'); UPDATE test SET t_age = 30 WHERE t_id = 101; DELETE test WHERE t_id = 101;
--然后查看效果
SELECT * FROM test;
SELECT * FROM test_log;
3、创建触发器,它将映射emp表中每个部门的总人数和总工资。
--创建映射表
CREATE TABLE dept_sal
AS
SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;
DESC dept_sal;
--创建触发器
CREATE OR REPLACE TRIGGER emp_info
AFTER INSERT OR UPDA TE OR DELETE ON emp
DECLARE
CURSOR cur_emp IS
SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;
BEGIN
DELETE dept_sal; --触发时首先删除映射表信息
FOR v_emp IN cur_emp LOOP
--DBMS_OUTPUT.PUT_LINE(v_emp.deptno || v_emp.total_emp || v_emp.total_sal);
--插入数据
INSERT INTO dept_sal
V ALUES(v_emp.deptno,v_emp.total_emp,v_emp.total_sal);
END LOOP;
END;
/