二、填空题

1、调用函数MOD(123,10)返回值为__3__。

2、select round (123.67,1) from dual;这语句输出值为____123.7___。

3、创建一个临时替代变量使用的字符是___&__。

4、若v_comm = 2800, X := NVL (V_comm,0) ,则X的值为__2800___。

5、调用函数INSTR(‘Here you are’,’er’)返回值为__2__。

三、判断题

1、WHERE子句限制行记录,也可以指定限制分组结果的条件。            (×)

2、具有UNIQUE约束的列不能包含多个空值。                           (×)

3、DATE型数据中包含着时间值。                                      (√)

4、具有外键约束的列可以包含空值。                                   (√)

5、如果在类型为char(4)的列中输入“hello”,则只能存储hell。            (√)

6、含有Group by子句的查询,其结果是排好序的。                      (√)

7、定义游标时,其中的select语句不能使用order by子句。(子查询不能用)  (×)

8、过程可以有返回值。                                               (√)

9、触发器一定会被激发。                                             (×)

10、instead of触发器只是基于视图的。                                  (√)

四、写出相应的SQL语句(括号内为列名)

1、查询从事各工作(JOB)的员工人数。

Select job,count(*) from emp group by job;

2、查询与员工SMITH在同一部门(DEPTNO)的员工的姓名(ENAME),工资(SAL)和部门。

Select ename,sal,deptno from emp where deptno=(select deptno from emp where ename=’SMITH’);

3、查询所有员工的姓名(ENAME),工资(SAL)和工资等级(GRADE)。

Select ename,sal,grade from emp,salgrade where sal between losal and hisal;

4、查询获得工资(SAL)最高的3个员工信息。

Select * from (select * from emp order by sal desc) where rownum<=3;

5、查询所有员工的姓名(ENAME)及其主管姓名(ENAME)。

Select e1.ename empname,e2.ename mgrname from emp e1,emp e2 where e1.mgr=e2.empno;

五、简答题

1.      在PL/SQL程序中,进行用户自定义异常处理的3个步骤是什么?

可以通过声明和发布来截获自定义异常。

一、在声明部分为声明自定义异常名。

二、在执行部分使用 RAISE 语句显式地发布异常。

三、在相应的异常处理例程中引用已声明的异常。

2.      触发触发器的数据操作有哪些?

Insert 条件谓词 inserting;

Update条件谓词 updating;

Delete 条件谓词 deleting。

3.      解释视图的含义以及使用视图的好处。

视图是一种Oracle对象,是来自一张或多张表或视图中数据的子集的逻辑表示。

特点:限制对数据库的访问;容易实现数据的复杂的查询;维护数据的独立性;对于相同的数据可以产生不同的视图。

4.      简述ORACLE中5种约束及其作用。

Primary key 确保非空且唯一;

Foreign key 确保引用完整性;

Unique 确保列或者列的组合中的每个值都是唯一的;

Check 限制每条记录都要满足的条件;

Not null 确保该列不能保存空值。

5.      ORACLE中过程和函数的异同点。

两者都带有0个或多个参数,参数可以具有模式。

两者都是PL/SQL语句块的不同形式,都有声明段、可执行段以及异常段。

两者都可以存储在数据库中或在语句块中声明

两者不同的是,过程调用本身是一个PL/SQL语句,而函数总是向调用块返回一个值。

6.      使用%rowtype属性声明记录变量的优点是什么?

可以不必知道数据库中列的数量和类型。

在运行期间,数据库中列的数量和类型可能发生变化。

在SELECT语句中使用该属性可以有效地检索表中的行。

六、编程题

1、创建一个PL/SQL块,根据用户输入的编号,在emp表中查询出该编号的员工姓名、部门号及其主管编号,要有异常处理。

SET serveroutput ON;

Declare

v_empno emp.empno%type:=’&员工编号’;

v_ename emp.ename%type;

v_deptno emp.deptno%type;

v_mgr emp.mgr%type;

Begin

SELECT ename,deptno,mgr INTO v_ename,v_deptno,v_mgr from emp WHERE empno=v_empno;

DBMS_OUTPUT.PUT_LINE(‘员工’||v_ename||’在部门’||’v_deptno’||’主管’||v_mgr);

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE(‘没有此员工’);

END;

2、创建一个PL/SQL块,根据用户输入的工作,从emp表中逐条输出从事这一工作的每位员工的编号、姓名和受雇如期,每条信息格式如下:(用游标实现)

编号    姓名      受雇日期

7751    JOHN      95-12-31

Declare

Cursor emp_cur(v_job emp.job%TYPE) is

Select empno,ename,hiredate from emp where job=v_job;

v_empno emp.empno%TYPE;

v_ename emp.ename%TYPE;

v_hiredate emp.hiredate%TYPE;

BEGIN

OPEN emp_cur(upper(‘&job’));

LOOP

Fetch emp_cur INTO v_empno,v_ename,v_hiredate;

Exit when emp_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(‘编号   姓名   工资’);

DBMS_OUTPUT.PUT_LINE(v_empno||v_ename||v_hiredate);

END LOOP;

CLOSE emp_cur;

END;

Declare

Cursor emp_cur(v_job emp.job%TYPE) is

Select empno,ename,hiredate from emp where job=v_job;

v_empno emp.empno%TYPE;

v_ename emp.ename%TYPE;

v_hiredate emp.hiredate%TYPE;

BEGIN

FOR i IN emp_cur(upper(‘&job’)) LOOP

v_empno:=i.empno;

v_ename:=i. ename;

v_hiredate:=i. hiredate;

DBMS_OUTPUT.PUT_LINE(‘编号   姓名   工资’);

DBMS_OUTPUT.PUT_LINE(v_empno||v_ename||v_hiredate);

END LOOP;

END;

3、编写一个函数,用于判断EMP表中某一工作(JOB)是否存在,若EMP表存在此工作名称,则返回TRUE,否则返回FALSE。

CREATE OR REPLACE FUNCTION f_emp(f_job emp.job%TYPE)

RETURN BOOLEAN

Is

v_job emp.job%TYPE;

BEGIN

SELECT DISTINCT job INTO v_job FROM emp WHERE job=f_job;

RETURN TRUE;

EXCEPTION

WHEN NO_DATA_FOUND THEN

RETURN FALSE;

END f_emp;

Begin

If f_emp(upper(‘&job’)) THEN

DBMS_OUTPUT.PUT_LINE(‘日’);

ELSE

DBMS_OUTPUT.PUT_LINE(‘插’);

END IF;

END;

4、编写一触发器,在EMP表执行插入或修改前被激发,此触发器将对员工的工资(SAL)超过5000进行报错,不能插入或修改,不超过5000的才将员工编号、工作及当时的日期(SYSDATE)插入UP_EMP表

(注:此表已建好,表结构为UP_EMP(EMPNO NUMBER(4),SAL NUMBER(7,2),UDETE DATE))

CREATE OR REPLACE TRIGGER t_emp_sal

BEFORE INSERT OR UPDATE ON emp

Begin

IF :new.sal>5000 THEN

RAISE_APPLICATIONG_ERROR(‘ERROR!!’);

ELSE

INSERT int up_emp VALUES(empno,sal,sysdate);

END IF;

END;