///////用户登录到数据库时,会自动激活其默认角色 SQL>conn allen/allen
SQL>SELECT ename,sal FROM scott.emp WHERE empno=7788; SQL>UPDATE scott.emp SET sal=4000 WHERE empno=7788; ORA-01031:权限不足
激活PRV_ROLE角色,重新修改SCOTT.EMP表中雇员号为7788的雇员SAL列数据为4000。
/////为了使用非默认角色的权限操作,必须激活非默认角色。 SQL>SET ROL prv_role IDENTIFIED BY prv;
SQL>UPDATE scott.emp SET sal=4000 WHERE empno=7788;
显示用户ALLEN所具有的角色以及默认角色。
//////为了显示用户所具有的角色信息,可以查询数据字典视图DBA_ROLE_PRIVS. SQL>SELECT granted_role,default_role FROM dab_role_privs WHERE grantee=?ALLEN?;
实验七 PL/SQL基础
简述PL/SQL语言的特点。
PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言。具有如下特点:
与SQL语言紧密集成,所有的SQL语句在PL/SQL中都得到支持; 减小网络流量,提高应用程序的运行性能。 模块化的程序设计功能,提高系统可靠性。 服务器端程序设计,可移植性好。
简述游标的作用和游标操作的基本步骤。
游标的作用是将数据库的中数据检索出来后缓存,可以被PL/SQL程序一行一行的读取并处理。支持一条、多条、零条记录的处理。游标的基本操作步骤为声明游标、打开游标、检索游标、关闭游标。
编写一个PL/SQL块,输出所有员工的员工名、员工号、工资和部门号。 DECLARE
CURSOR C_EMP IS SELECT * FROM EMP; BEGIN
OPEN C_EMP;
FOR V_EMP IN C_EMP LOOP
―――FOR V_EMP IN (SELECT * FROM EMP) LOOP DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME||' '||V_EMP.EMPNO||' '||V_EMP.DEPTNO||' '||V_EMP.SAL); END LOOP; END;
第 21 页 共 27 页
查询名为“SMITH”的员工信息,并输出其员工号、工资、部门号。如果该员工不存在,则插入一条新记录,员工号为2007,员工名为“SMITH”,工资为1500,部门号为10。如果存在多个名为“SMITH”的员工,则输出所有名为“SMITH”的员工号、工资和部门号。 DECLARE
V_EMP EMP%ROWTYPE; BEGIN
SELECT * INTO V_EMP FROM EMP WHERE ENAME='SMITH'; DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO||' '||V_EMP.SAL||' '||V_EMP.DEPTNO); EXCEPTION
WHEN NO_DATA_FOUND THEN INSERT INTO EMP(EMPNO,ENAME,SAL,DEPTNO) VALUES(2007,'SMITH',1500,10); WHEN TOO_MANY_ROWS THEN
FOR V IN (SELECT * FROM EMP WHERE ENAME='SMITH') LOOP DBMS_OUTPUT.PUT_LINE(V.EMPNO||' '||V.SAL||' '||V.DEPTNO); END LOOP; END;
实验八 管理表、索引、视图
表的约束有几种,分别起什么作用? 表的约束包括: ? 主键约束:定义了主键约束的列取值不能为空,也不能重复。 ? 唯一值约束:定义了唯一值约束的列取值不能重复。 ? 检查约束:定义了检查约束的列取值要满足检查条件。 ? 外键约束:定义了外键约束的列取值要么是主表参照列的值,要么是空值。 ? 空/非空约束:定义了非空约束的列取值不能为空。 操作题
(1)按下表结构利用SQL语句创建class、student两个表。
第 22 页 共 27 页
Create table class(
CNO number(2) primary key, CNAME varchar2(20), NUM number(3) )
Create table student(
SNO number(4) primary key, SNAME varchar2(10) unique, SAGE number, SEX char(2), CNO number(2) )
(2)为student表添加一个可以延迟的外键约束,其CNO列参照class表的CNO列。 Alter table student add constraint fk_cno foreign key (cno) references class(cno) deferrable;
(3)为student表的SAGE列添加一个检查约束,保证该列取值在0~100之间。 Alter table student add constraint ck_sage check (sage>0 and sage<=100);
(4)为student表的SEX列添加一个检查约束,保证该列值为“M”或“F”,且默认值“M”。 alter table student add constraint ck_stu check(sex='M' or sex='F')modify sex default 'M'
索引
第 23 页 共 27 页
说明索引的作用,以及ORACLE数据库中索引的类型。
索引用于提高数据的查询效率。根据索引值是否唯一,可以分为唯一性索引和非唯一性索引;根据索引的组织结构不同,可以分为平衡树索引和位图索引;根据索引基于的列数不同可以分为单列索引和复合索引。
说明数据库中使用索引的优点和缺点,以及索引是如何工作的。
在数据库中使用索引可以提高对表中数据的查询速度,但是,向表中插入数据需要更新索引,会影响更新速度。如果表建了索引,在有条件查询时,系统先对索引表进行查询,利用索引表可以找到相应记录的ROWID。索引建好后,由系统负责更新。
基于第3题(1)的表,完成下面题目
(1)在class表的CNAME列上创建一个唯一性索引。 Create unique index ind_cname on class(cname);
视图
(2)创建一个视图,包含员工号、员工名和该员工领导的员工号、员工名。 Create view employee_v(empno,ename,mgr_no,mgr_name) As
Select e1.empno,e1.ename,e1.mgr,e2.ename from emp e1 join emp e2 on e1.mgr=e2.empno;
(3)创建一个class_number簇,聚簇字段名为CNO,类型为NUMBER(2),然后利用该簇,创建student和class两个聚簇表。
Create cluster class_number(cno NUMBER(2));
Create table class(
CNO number(2) primary key, CNAME varchar2(20), NUM number(3)
)Cluster class_number(cno);
Create table student(
SNO number(4) primary key, SNAME varchar2(10) unique, SAGE number, SEX char(2), CNO number(2)
)Cluster class_number(cno);
(4)创建一个起始值为10000的序列,步长为2,最大值为100000,不可循环。 Create sequence sequ1 increment by 2 start with 10000 maxvalue 100000 nocycle;
第 24 页 共 27 页
(5)为SCOTT模式下的emp表创建一个公共同义词,名称为employee。 Create public synonym employee for scott.emp;
实验九 过程、函数、程序包
创建一个存储过程,以员工号为参数,输出该员工工资。
CREATE OR REPLACE PROCEDURE SHOWSAL(p_empno emp.empno%type) AS
v_sal emp.sal%TYPE; BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno=p_empno; DBMS_OUTPUT.PUT_LINE(v_sal); END;
begin
showsal(7844); end;
创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部分,则工资增加150;若属于20号部门,则工资增加200;若属于30号部门,则工资增加250;若属于其他部门,则工资增长300。 CREATE OR REPLACE PROCEDURE UPDATESAL (p_empno emp.empno%TYPE) AS
v_deptno emp.deptno%TYPE; v_inc emp.sal%TYPE; BEGIN
SELECT deptno INTO v_deptno FROM emp WHERE empno=p_empno; CASE v_deptno
WHEN 10 THEN v_inc:=150; WHEN 20 THEN v_inc:=200; WHEN 30 THEN v_inc:=250; ELSE v_inc:=300; END CASE;
UPDATE emp SET sal=sal+v_inc WHERE empno=p_empno; END;
创建一个函数,以员工号为参数,返回该员工工资。
CREATE OR REPLACE FUNCTION fun_sal(p_empno emp.empno%type) RETURN emp.sal%TYPE AS
v_sal emp.sal%TYPE; BEGIN
SELECT sal INTO v_sal FROM EMP WHERE empno=p_empno;
第 25 页 共 27 页