《Oracle数据库》实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

/

相关文档
最新文档