如果想运行缓冲区的内容,那么可以用RUN命令或者/命令。 2.无参数的存储过程 首先创建表:
SQL> create table log_table( 2 user_id varchar2(10), 3 log_date varchar2(12));
CREATE OR REPLACE PROCEDURE log_execution IS
BEGIN
INSERT INTO log_table (user_id,log_date) VALUES (user,sysdate); END; /
存储过程的在SQL*Plus中运行 SQL>EXECUTE log_execution;
3.带输入参数的存储过程
解雇给定职工号的职工,并调用log_execution: SQL> CREATE OR REPLACE PROCEDURE fire_emp
2 (v_emp_no IN emp.empno%type) 3 IS
4 BEGIN
5 Log_execution;
6 DELETE FROM EMP WHERE empno = v_emp_no; 7 END; 8 /
SQL>EXECUTE fire_emp(7654);
存储过程删除了职工号7654的职工。
4.带输入输出的存储过程
查询EMP中给定职工号的姓名、工资和佣金。
SQL> CREATE OR REPLACE PROCEDURE query_emp 2 (v_emp_no IN emp.empno%type, 3 v_emp_name OUT emp.ename%type, 4 v_emp_sal OUT emp.sal%type, 5 v_emp_comm OUT emp.comm%type) 6 IS
7 BEGIN
8 SELECT ename,sal,comm
9 INTO v_emp_name,v_emp_sal,v_emp_comm 10 FROM EMP WHERE empno = v_emp_no;
11 END; 12 /
调用:
SQL>VAR emp_name varchar2(15); SQL>VAR emp_sal number; SQL>VAR emp_comm number;
SQL>EXECUTE query_emp(7566,:emp_name, :emp_sal, :emp_comm); PL/SQL procedure successfully completed. SQL>PRINT emp_name EMP_NAME ------------------- JONES
或者用以下语句调用: DECLARE
emp_name varchar2(15); emp_sal number; emp_comm number; BEGIN
query_emp(7566,emp_name, emp_sal, emp_comm);
DBMS_OUTPUT.PUT_LINE(emp_name||' '|| emp_sal||' '||emp_comm); END;
5.用Function查询出EMP中给定职工号的工资 SQL> CREATE OR REPLACE FUNCTION get_sal
2 (v_emp_no IN emp.empno%type) 3 RETURN number 4 AS
5 V_emp_sal emp.sal%type:= 0; 6 BEGIN
7 SELECT sal INTO v_emp_sal
8 FROM EMP WHERE empno = v_emp_no; 9 RETURN (v_emp_sal); 10 END; 11 /
SQL>VARIABLE emp_sal number;
SQL>EXECUTE :emp_sal := get_sal(7566); PL/SQL procedure successfully completed. SQL>PRINT emp_sal; EMP_SAL ------------------- 2975
【实验内容】
1、查询名为“SMITH”的员工信息,输出其员工号、工资、部门号。如果该员工不存在,则插入一条新记录,员工号为2007,员工名为“SMITH”,工资为1500,部门号为10. 2、创建一个存储过程,以员工号为参数,输出该员工的工资。
3、创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,则工资增加150;若属于20号部门,则工资增加200;若属于30号部门,则工资增加250;若属于其他部门,则工资增加300.
4、创建一个存储过程,以员工号为参数,返回该员工的工作年限(以参数形式返回)。 提示:可以采用日期函数months_between求工作的月份
5、创建一个函数,以员工号为参数,返回该员工所在部门的平均工资。
6、在emp表上创建一个触发器,当插入、删除或修改员工信息时,统计各个部门的人数及平均工资,并输出。
7、在dept表上创建触发器,保证该表的记录的删除可以成功完成。
8、在dept表上创建触发器,使得当DEPT表的deptno(主键)发生变化时,EMP表的相关行也要跟着进行适当的修改。
9、创建一个存储过程,以一个整数为参数,输出工资最高的前几个(参数值)员工的信息。 10、创建一个存储过程,以两个整数为参数,输出工资排序在两个参数之间的员工信息。 11、创建一个包,包中包含一个函数和一个过程。函数以部门号为参数,返回该部门员工的最高工资;过程以部门号为参数,输出该部门中工资最高的员工名、员工号。
实验六 简单的选课系统的设计与实现
【开发语言及实现平台或实验环境】
Oracle10g
【实验目的】
(1)进一步熟悉和掌握以上所有实验中的各种操作。 (2)能够在实际的事例中灵活运用学到的有关知识。 (3)能够编写满足某种要求的功能。
【实验原理】
参考以上几个实验。
【实验内容】
(1)为自己建立用户帐号(以学号为帐号)。
(2)以新建的帐号登录数据库,创建如下三个基表结构并输入相应表内容:
S (S#,SNAME,AGE,SEX) 对应的中文为: [学生 (学号,姓名,年龄,性别)]
SC (S#,C#,GRADE) 对应的中文为: [选课(学号,课程号,成绩)]
C(C#,CNAME,TEACHER) 对应的中文为: [课程(课程号,课程名,任课教师)] (3)用INSERT 命令输入数据
表1 基本表S的数据 S1 WANG 20 M S2 LIU 19 M S5 LOU 21 F S8 DONG 18 F
表2 基表C的数据 C1 MATHS MA C2 CHEMISTRY ZHOU C3 DB LI C5 OS WEN
表3 基本表SC的数据(空格为未选修) S# S1 S2 S5 S8 C# C1 80 85 70 90 C2 70 NULL 60 NULL C3 85 72 80 90 C5 70 65 65 NULL
(4)对S、C、SC表进行操作
1)把C2课程的非空成绩提高10%。
2)在S和SC表中删除学号为S8的所有数据。 (5)对基本表S、C、SC操作 1) 检索选修课程名为MATHS的学生学号与姓名。 2) 检索不学C2课的学生姓名与年龄。 3) 计算每个学生有成绩的课程门数和平均成绩。 (6)用PL/SQL的存储过程删除学号为S8的学生;
(7)用带输入输出参数的存储过程查询出任意给定学号和课程后的成绩; (8)用函数作第7题。