- 浏览: 172129 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
gwill_21:
dwr.xml找不到怎么办,难道要自己手写dwr.xml?痛苦 ...
DWR框架 —— 用户注册验证 -
recoba7:
MLDN魔乐科技 Oracle学习笔记 (5) -
lanni2460:
呵呵 尽管现在才看到这个 但是我真的觉得 李老师 讲的很好呢 ...
严重声明,那些恶意诋毁MLDN及李兴华老师的其他培训机构统统走开 -
chian_xxp:
只要把功能实现了,代码结构合理了,代码性能提高了,该注意的注意 ...
业务、业务、业务。。。 -
wzpbb:
密码多少啊??? 给一下啊
MLDN 魔乐科技 Oracle 学习笔记(2)
4.1 用户管理(了解)
在Oracle中已经熟悉的用户存在以下三个:
• 超级管理员:sys / change_on_install
• 普通管理员:system / manager
• 普通用户:scott / tiger
提示:对用户的修改设置,往往需要重新连接才能生效。
4.1.1 创建用户
在创建用户的时候需要有管理员的权限,可以使用sys用户登陆,创建用户。
创建用户的语法:
CREATE USER 用户名 IDENTIFIED BY 密码 ;
4.1.2 给用户授权
在SQL语法中授权的语法格式如下:
GRANT 权限1或角色,权限2或角色,…. TO 用户
(1)任何用户都需要给其授予CREATE SESSION的权限,CREATE SESSION是一个系统特权,它可以为用户提供连接数据库的能力。
例如:GRANT CREATE SESSION TO test ;
(2)DBA是一个具有超过120个系统特权的角色,所以它可以让用户在数据库中完成几乎任何工作。
例如:CRANT DBA TO test;
(3)在Oracle中提供了很多的用户的角色,可以使用CONNECT、RESOURCE两个角色,使用这两个角色,就可以完成和scott下一样的一些基本功能。(连接数据库和访问资源的权限)
例如:GRANT CONNECT,RESOURCE TO test ;
(4)授予其他用户下的表的访问、修改权限等。
例如:GRANT SELECT,DELETE ON scott.emp TO test ;
4.1.3 收回用户的授权
REVOKE 权限名 FROM 用户 ;
例如:REVOKE SELECT,DELETE ON scott.emp FROM test ;
4.1.4 修改用户密码
ALTER USER 用户名 IDENTIFIED BY 密码 ;
例如:将test用户的密码修改为hello
ALTER USER test IDENTIFIED BY hello ;
4.1.5 使用户密码失效
ALTER USER 用户名 PASSWORD EXPIRE ;
4.1.6 用户锁定与解锁
ALTER USER 用户名 ACCOUNT LOCK ;
ALTER USER 用户名 ACCOUNT UNLOCK ;
5.1 嵌套表(了解)
嵌套表是Oracle自己所独有的,其他数据库至少还没听过有此概念。
范例:现在有如下一种情况,一个部门可能成绩多个项目,那么如果此时,按照最原始的做法。
CREATE TABLE department(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR2(50) NOT NULL
) ;
CREATE TABLE project(
proid NUMBER(4) PRIMARY KEY ,
proname VARCHAR2(50) NOT NULL ,
prodate DATE NOT NULL ,
deptno NUMBER(2) ,
CONSTRAINT department_project_deptno FOREIGN KEY(deptno) REFERENCES department(deptno) ON DELETE CASCADE
) ;
肯定要使用两张表的形式完成功能,以上也是用的最多的一种形式,但是现在要求使用一张表完成此种格式?此时就需要使用嵌套表了。
如果要想完成,则首先第一步需要定义出一种数据类型,此类型表示project信息。
CREATE TYPE project_ty AS OBJECT(
proid NUMBER(4),
proname VARCHAR2(50),
prodate DATE
) ;
/
类型创建成功之后,下面需要使用此类型进行一个声明。
CREATE TYPE project_nt AS TABLE OF project_ty ;
/
以后在建立表的时候使用的就是project_nt进行字段的声明。
建立完以上的操作之后,下面就可以创建department表了。
CREATE TABLE department(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR2(50) NOT NULL ,
projects project_nt
) NESTED TABLE projects STORE AS project_nt_tab_temp ;
表创建成功之后,就可以进行插入数据的操作,但是在插入的时候一定要注意复杂类型。
INSERT INTO department(deptno,dname,projects)
VALUES (10,'技术部',project_nt(
project_ty(1001,'ERP',SYSDATE) ,
project_ty(1002,'CRM',SYSDATE) ,
project_ty(1003,'OA',SYSDATE)
)) ;
如果,此时要想查询一个部门中的全部的项目信息,则就必须写子查询。
SELECT * FROM TABLE (SELECT projects FROM department WHERE deptno=10) ;
5.2 可变数组(了解)
可变数组属于嵌套表的升级版,在可变数组中,实际上就是将内部的嵌套表的内容的长度进行了限制。
例如:一个部门有多个工人。如果按照可变数组的做法,肯定首先要做出一个工人的类型。
CREATE TYPE worker_info AS OBJECT(
id NUMBER ,
name VARCHAR2(50) ,
sex VARCHAR2(20)
) ;
/
声明有10个元素的数组;
CREATE TYPE woker_info_list AS ARRAY(10) OF worker_info ;
/
下面建立表,并在表中使用此类型。
CREATE TABLE department2(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR2(50) NOT NULL ,
workers woker_info_list
) ;
下面插入测试数据:
INSERT INTO department2(deptno,dname,workers)
VALUES (10,'技术部',woker_info_list(
worker_info(1001,'张三','男') ,
worker_info(1002,'李四','女')
)) ;
对于嵌套和可变数组来讲,本身并不是在数据库开发中提倡使用的概念,但是作为Oracle的特性只是简单的介绍一下,大概了解其概念即可。
6.1 PL/SQL语句(重点)
在Oracle中本身也有自己的程序设计,那么这种程序设计就是使用PL•SQL完成,例如,定义过程(存储过程)、游标、触发器、函数、包等等。
但是从现代的开发角度来讲,以上的程序的作用基本上已经没有了。
如果要想使用一个PL•SQL块,则必须按照以下的格式进行:
DECLARE
-- 程序的声明部分,例如,定义变量
BEGIN
-- 程序的执行体,具体的操作代码
EXCEPTION
-- 异常的处理
END ;
/
6.1.1 输入输出
范例:使用PLSQL定义一个变量,并同时输出此变量
DECLARE
i NUMBER ;
BEGIN
i := 30 ;
DBMS_OUTPUT.put_line('变量:' || i) ;
END ;
/
以上的操作没有任何的输出,因为在Oracle中默认情况下是将输出屏蔽掉的,所以必须通过以下的命令打开Oracle中的系统输出:
SET SERVEROUTPUT ON ;
以上就完成了一个简单的PL•SQL程序。
DECLARE
i NUMBER ;
BEGIN
i := &tempi ; //赋值采用 :=
DBMS_OUTPUT.put_line('变量:' || i) ;
END ;
/
那么,下面就可以利用以上的PL•SQL块完成一些复杂的功能,例如,假设希望输入雇员的编号,之后将雇员的姓名取出。
DECLARE
eno NUMBER ;
name VARCHAR2(50) ;
BEGIN
eno := &empno ;
SELECT ename INTO name FROM emp WHERE empno=eno ;
DBMS_OUTPUT.put_line('编号为:' || eno || '的雇员的姓名是:' || name) ;
END ;
/
但是,以上的操作是雇员编号已经存在的情况完成的,如果现在输入了一个雇员编号,但是此雇员不存在呢?
执行的时候出现了错误,则此时就需要使用异常进行处理。
DECLARE
eno NUMBER ;
name VARCHAR2(50) ;
BEGIN
eno := &empno ; //&表示输入,empno表示输入提示
SELECT ename INTO name FROM emp WHERE empno=eno ;
DBMS_OUTPUT.put_line('编号为:' || eno || '的雇员的姓名是:' || name) ;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.put_line('没有这个雇员') ;
END ;
/
6.1.2 分支结构
在PL•SQL之中还包含了分支语句,可以使用IF进行判断
DECLARE
coun NUMBER ;
BEGIN
SELECT COUNT(empno) INTO coun FROM emp ;
IF COUN>10 THEN
DBMS_OUTPUT.put_line('记录大于10条。') ;
END IF ;
END ;
/
那么,也可以加入if..else语句
DECLARE
coun NUMBER ;
BEGIN
SELECT COUNT(empno) INTO coun FROM emp ;
IF COUN>20 THEN
DBMS_OUTPUT.put_line('记录大于20条。') ;
ELSE
DBMS_OUTPUT.put_line('记录小于20条。') ;
END IF ;
END ;
/
在PLSQL中还可以使用IF..ELSIF..END IF语句。
DECLARE
coun NUMBER ;
BEGIN
coun := 2 ;
IF coun=1 THEN
DBMS_OUTPUT.put_line('值是1') ;
ELSIF coun=2 THEN
DBMS_OUTPUT.put_line('值是2') ;
ELSE
DBMS_OUTPUT.put_line('值不是1和2') ;
END IF ;
END ;
/
6.1.3 循环结构
在PL•SQL语句中还支持循环的操作。
如果要想完成循环操作,则可以使用LOOP语句。
LOOP
语句 ;
EXIT WHEN 退出条件 ;
条件修改 ;
END LOOP;
下面编写代码,循环输出1~10的内容。
DECLARE
eno NUMBER ;
BEGIN
eno := 1 ;
LOOP
DBMS_OUTPUT.put_line('eno = ' || eno) ;
eno := eno + 1 ;
EXIT WHEN eno>10 ;
END LOOP;
END ;
/
在PL•SQL块中还包含其他的循环,while循环。While循环的格式:
WHILE (退出条件) LOOP
语句 ;
修改循环条件 ;
END LOOP ;
下面使用WHILE循环完成以上的操作。
DECLARE
eno NUMBER ;
BEGIN
eno := 1 ;
WHILE(eno<=10) LOOP
DBMS_OUTPUT.put_line('eno = ' || eno) ;
eno := eno + 1 ;
END LOOP;
END ;
/
在循环中也可以使用for循环完成功能
DECLARE
eno NUMBER ;
BEGIN
FOR eno IN 1..10 LOOP
DBMS_OUTPUT.put_line('eno = ' || eno) ;
END LOOP;
END ;
/
7.1 数据库设计范式
数据库设计中本身是存在一些设计的标准,但是从实际的开发角度来看,以上的标准只能做为一个参考,如果全部按照此标准执行,则程序的运行效率将是相当差的。
7.1.1 范式一
数据库表中的字段不可再分,是唯一的一个。例如,现在有如下的一张表:
CREATE TABLE person(
perid NUMBER PRIMARY KEY ,
name VARCHAR2(50) ,
address VARCHAR2(250)
) ;
现在以上的一张表中,设计是否存在问题?
实际上有一些问题,地址信息太大了,还可以进一步的划分,分为邮政编码、具体的地址、地区、子地区。
CREATE TABLE person(
perid NUMBER PRIMARY KEY ,
name VARCHAR2(50) ,
zipcode VARCHAR2(50) ,
area VARCHAR2(50) ,
subarea VARCHAR2(50) ,
address VARCHAR2(250)
) ;
所以,以上的设计就相当于合理一些,那么,对于第一范式也有一些注意点。
CREATE TABLE person(
perid NUMBER PRIMARY KEY ,
name VARCHAR2(50) ,
zipcode VARCHAR2(50) ,
area VARCHAR2(50) ,
subarea VARCHAR2(50) ,
address VARCHAR2(250) ,
biryear NUMBER ,
birmonths NUMBER ,
birday NUMBER
) ;
对于生日来讲应该是一个完整的日期,但是以上的做法太细了。所以此种设计是不合理的。
7.1.2 范式二
数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
CREATE TABLE selectcourse(
stuno NUMBER ,
stuname VARCHAR2(50) ,
stuage NUMBER ,
cname VARCHAR(50) ,
stugrade NUMBER ,
credit NUMBER
) ;
以上的设计完全符合于第一范式,但是不符合于第二范式,因为以上表的字段存在着依赖的关系。
INSERT INTO selectcourse(stuno,stuname,stuage,cname,stugrade,credit) VALUES (1,'zhangsan',20,'java',89,3) ;
INSERT INTO selectcourse(stuno,stuname,stuage,cname,stugrade,credit) VALUES (2,'lisi',20,'java',79,3) ;
INSERT INTO selectcourse(stuno,stuname,stuage,cname,stugrade,credit) VALUES (1,'zhangsan',20,'oracle',78,3) ;
以上代码的问题:
• 数据冗余:学生信息、课程信息
• 假设课程信息修改了,则要同时修改多条
• 如果一门课程一个学生都没有参加,则此课程将不存在。
要想解决以上的问题,则需要进行进一步的表的细分,分出实体表和关系表。
CREATE TABLE student(
stuno NUMBER PRIMARY KEY ,
stuname VARCHAR2(50) ,
stuage NUMBER
) ;
CREATE TABLE course(
cid NUMBER PRIMRAY KEY ,
cname VARCHAR(50) ,
credit NUMBER
) ;
以上建立了两张实体表,实体表建立完成之后,下面必须设置出关系。
一个学生可能选多门课程,一门课程会有多个学生参加。
CREATE TABLE selectcourse(
stuno NUMBER ,
cid NUMBER ,
stugrade NUMBER ,
CONSTRAINT student_selectcourse_stuno_fk FOREIGN KEY(stuno) REFERENCES student(stuno) ON DELETE CASCADE ,
CONSTRAINT student_selectcourse_cid_fk FOREIGN KEY(cid) REFERENCES course(cid) ON DELETE CASCADE
) ;
此时,更新学生信息或更新课程信息都非常的方便。在关系表中将两个实体进行关联的配置。
以上实际上属于多对多的设计关系。
7.1.3 范式三
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)
按照第二范式,设计出两张表。
CREATE TABLE student(
stuno NUMBER PRIMARY KEY ,
stuname VARCHAR2(50) ,
stuage NUMBER
) ;
CREATE TABLE school(
sid NUMBER PRIMRAY KEY ,
sname VARCHAR(50) ,
loc VARCHAR2(50) ,
tel VARCHAR2(50)
) ;
CREATE TABLE studentschool(
stuno NUMBER ,
sid NUMBER ,
CONSTRAINT student_studentschool_stuno_fk FOREIGN KEY(stuno) REFERENCES student(stuno) ON DELETE CASCADE ,
CONSTRAINT student_studentschool_sid_fk FOREIGN KEY(sid) REFERENCES school(sid) ON DELETE CASCADE
) ;
以上的设计符合于第二范式,但是会存在那些问题?
一般情况下,一个学生基本上就在一个学院待着,那么如果按照以上的设计,一个学生可以同时待在多个学院,一个学院会有多个学生。
那么,此时明显不符合具体的要求。Oracle中存在雇员和部门的关系。
CREATE TABLE school(
sid NUMBER PRIMRAY KEY ,
sname VARCHAR(50) ,
loc VARCHAR2(50) ,
tel VARCHAR2(50)
) ;
CREATE TABLE student(
stuno NUMBER PRIMARY KEY ,
stuname VARCHAR2(50) ,
stuage NUMBER ,
sid NUMBER ,
CONSTRAINT student_school_sid_fk FOREIGN KEY(sid) REFERENCES school(sid)
) ;
所以,以上的做法实际上是一种一对多的关系,在实际的开发中一对多也是出现最多的一种设计思路。
但是,以上的三种范式,只能作为参考使用,开发中如果全部按照此范式操作也会存在问题。
开发中的操作范式只有一个原则:减少复杂的查询SQL语句,减少表的关联查询。
8.1 PowerDesigner工具的使用
在进行数据库的分析和设计中,基本上都要使用一些设计的工具,那么设计工具中有一个称为PowerDesigner的设计,此工具使用最为广泛,此工具是Sybase公司出品的。
建立数据库模型
9.1 过程与函数
在Oracle中已经熟悉的用户存在以下三个:
• 超级管理员:sys / change_on_install
• 普通管理员:system / manager
• 普通用户:scott / tiger
提示:对用户的修改设置,往往需要重新连接才能生效。
4.1.1 创建用户
在创建用户的时候需要有管理员的权限,可以使用sys用户登陆,创建用户。
创建用户的语法:
CREATE USER 用户名 IDENTIFIED BY 密码 ;
4.1.2 给用户授权
在SQL语法中授权的语法格式如下:
GRANT 权限1或角色,权限2或角色,…. TO 用户
(1)任何用户都需要给其授予CREATE SESSION的权限,CREATE SESSION是一个系统特权,它可以为用户提供连接数据库的能力。
例如:GRANT CREATE SESSION TO test ;
(2)DBA是一个具有超过120个系统特权的角色,所以它可以让用户在数据库中完成几乎任何工作。
例如:CRANT DBA TO test;
(3)在Oracle中提供了很多的用户的角色,可以使用CONNECT、RESOURCE两个角色,使用这两个角色,就可以完成和scott下一样的一些基本功能。(连接数据库和访问资源的权限)
例如:GRANT CONNECT,RESOURCE TO test ;
(4)授予其他用户下的表的访问、修改权限等。
例如:GRANT SELECT,DELETE ON scott.emp TO test ;
4.1.3 收回用户的授权
REVOKE 权限名 FROM 用户 ;
例如:REVOKE SELECT,DELETE ON scott.emp FROM test ;
4.1.4 修改用户密码
ALTER USER 用户名 IDENTIFIED BY 密码 ;
例如:将test用户的密码修改为hello
ALTER USER test IDENTIFIED BY hello ;
4.1.5 使用户密码失效
ALTER USER 用户名 PASSWORD EXPIRE ;
4.1.6 用户锁定与解锁
ALTER USER 用户名 ACCOUNT LOCK ;
ALTER USER 用户名 ACCOUNT UNLOCK ;
5.1 嵌套表(了解)
嵌套表是Oracle自己所独有的,其他数据库至少还没听过有此概念。
范例:现在有如下一种情况,一个部门可能成绩多个项目,那么如果此时,按照最原始的做法。
CREATE TABLE department(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR2(50) NOT NULL
) ;
CREATE TABLE project(
proid NUMBER(4) PRIMARY KEY ,
proname VARCHAR2(50) NOT NULL ,
prodate DATE NOT NULL ,
deptno NUMBER(2) ,
CONSTRAINT department_project_deptno FOREIGN KEY(deptno) REFERENCES department(deptno) ON DELETE CASCADE
) ;
肯定要使用两张表的形式完成功能,以上也是用的最多的一种形式,但是现在要求使用一张表完成此种格式?此时就需要使用嵌套表了。
如果要想完成,则首先第一步需要定义出一种数据类型,此类型表示project信息。
CREATE TYPE project_ty AS OBJECT(
proid NUMBER(4),
proname VARCHAR2(50),
prodate DATE
) ;
/
类型创建成功之后,下面需要使用此类型进行一个声明。
CREATE TYPE project_nt AS TABLE OF project_ty ;
/
以后在建立表的时候使用的就是project_nt进行字段的声明。
建立完以上的操作之后,下面就可以创建department表了。
CREATE TABLE department(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR2(50) NOT NULL ,
projects project_nt
) NESTED TABLE projects STORE AS project_nt_tab_temp ;
表创建成功之后,就可以进行插入数据的操作,但是在插入的时候一定要注意复杂类型。
INSERT INTO department(deptno,dname,projects)
VALUES (10,'技术部',project_nt(
project_ty(1001,'ERP',SYSDATE) ,
project_ty(1002,'CRM',SYSDATE) ,
project_ty(1003,'OA',SYSDATE)
)) ;
如果,此时要想查询一个部门中的全部的项目信息,则就必须写子查询。
SELECT * FROM TABLE (SELECT projects FROM department WHERE deptno=10) ;
5.2 可变数组(了解)
可变数组属于嵌套表的升级版,在可变数组中,实际上就是将内部的嵌套表的内容的长度进行了限制。
例如:一个部门有多个工人。如果按照可变数组的做法,肯定首先要做出一个工人的类型。
CREATE TYPE worker_info AS OBJECT(
id NUMBER ,
name VARCHAR2(50) ,
sex VARCHAR2(20)
) ;
/
声明有10个元素的数组;
CREATE TYPE woker_info_list AS ARRAY(10) OF worker_info ;
/
下面建立表,并在表中使用此类型。
CREATE TABLE department2(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR2(50) NOT NULL ,
workers woker_info_list
) ;
下面插入测试数据:
INSERT INTO department2(deptno,dname,workers)
VALUES (10,'技术部',woker_info_list(
worker_info(1001,'张三','男') ,
worker_info(1002,'李四','女')
)) ;
对于嵌套和可变数组来讲,本身并不是在数据库开发中提倡使用的概念,但是作为Oracle的特性只是简单的介绍一下,大概了解其概念即可。
6.1 PL/SQL语句(重点)
在Oracle中本身也有自己的程序设计,那么这种程序设计就是使用PL•SQL完成,例如,定义过程(存储过程)、游标、触发器、函数、包等等。
但是从现代的开发角度来讲,以上的程序的作用基本上已经没有了。
如果要想使用一个PL•SQL块,则必须按照以下的格式进行:
DECLARE
-- 程序的声明部分,例如,定义变量
BEGIN
-- 程序的执行体,具体的操作代码
EXCEPTION
-- 异常的处理
END ;
/
6.1.1 输入输出
范例:使用PLSQL定义一个变量,并同时输出此变量
DECLARE
i NUMBER ;
BEGIN
i := 30 ;
DBMS_OUTPUT.put_line('变量:' || i) ;
END ;
/
以上的操作没有任何的输出,因为在Oracle中默认情况下是将输出屏蔽掉的,所以必须通过以下的命令打开Oracle中的系统输出:
SET SERVEROUTPUT ON ;
以上就完成了一个简单的PL•SQL程序。
DECLARE
i NUMBER ;
BEGIN
i := &tempi ; //赋值采用 :=
DBMS_OUTPUT.put_line('变量:' || i) ;
END ;
/
那么,下面就可以利用以上的PL•SQL块完成一些复杂的功能,例如,假设希望输入雇员的编号,之后将雇员的姓名取出。
DECLARE
eno NUMBER ;
name VARCHAR2(50) ;
BEGIN
eno := &empno ;
SELECT ename INTO name FROM emp WHERE empno=eno ;
DBMS_OUTPUT.put_line('编号为:' || eno || '的雇员的姓名是:' || name) ;
END ;
/
但是,以上的操作是雇员编号已经存在的情况完成的,如果现在输入了一个雇员编号,但是此雇员不存在呢?
执行的时候出现了错误,则此时就需要使用异常进行处理。
DECLARE
eno NUMBER ;
name VARCHAR2(50) ;
BEGIN
eno := &empno ; //&表示输入,empno表示输入提示
SELECT ename INTO name FROM emp WHERE empno=eno ;
DBMS_OUTPUT.put_line('编号为:' || eno || '的雇员的姓名是:' || name) ;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.put_line('没有这个雇员') ;
END ;
/
6.1.2 分支结构
在PL•SQL之中还包含了分支语句,可以使用IF进行判断
DECLARE
coun NUMBER ;
BEGIN
SELECT COUNT(empno) INTO coun FROM emp ;
IF COUN>10 THEN
DBMS_OUTPUT.put_line('记录大于10条。') ;
END IF ;
END ;
/
那么,也可以加入if..else语句
DECLARE
coun NUMBER ;
BEGIN
SELECT COUNT(empno) INTO coun FROM emp ;
IF COUN>20 THEN
DBMS_OUTPUT.put_line('记录大于20条。') ;
ELSE
DBMS_OUTPUT.put_line('记录小于20条。') ;
END IF ;
END ;
/
在PLSQL中还可以使用IF..ELSIF..END IF语句。
DECLARE
coun NUMBER ;
BEGIN
coun := 2 ;
IF coun=1 THEN
DBMS_OUTPUT.put_line('值是1') ;
ELSIF coun=2 THEN
DBMS_OUTPUT.put_line('值是2') ;
ELSE
DBMS_OUTPUT.put_line('值不是1和2') ;
END IF ;
END ;
/
6.1.3 循环结构
在PL•SQL语句中还支持循环的操作。
如果要想完成循环操作,则可以使用LOOP语句。
LOOP
语句 ;
EXIT WHEN 退出条件 ;
条件修改 ;
END LOOP;
下面编写代码,循环输出1~10的内容。
DECLARE
eno NUMBER ;
BEGIN
eno := 1 ;
LOOP
DBMS_OUTPUT.put_line('eno = ' || eno) ;
eno := eno + 1 ;
EXIT WHEN eno>10 ;
END LOOP;
END ;
/
在PL•SQL块中还包含其他的循环,while循环。While循环的格式:
WHILE (退出条件) LOOP
语句 ;
修改循环条件 ;
END LOOP ;
下面使用WHILE循环完成以上的操作。
DECLARE
eno NUMBER ;
BEGIN
eno := 1 ;
WHILE(eno<=10) LOOP
DBMS_OUTPUT.put_line('eno = ' || eno) ;
eno := eno + 1 ;
END LOOP;
END ;
/
在循环中也可以使用for循环完成功能
DECLARE
eno NUMBER ;
BEGIN
FOR eno IN 1..10 LOOP
DBMS_OUTPUT.put_line('eno = ' || eno) ;
END LOOP;
END ;
/
7.1 数据库设计范式
数据库设计中本身是存在一些设计的标准,但是从实际的开发角度来看,以上的标准只能做为一个参考,如果全部按照此标准执行,则程序的运行效率将是相当差的。
7.1.1 范式一
数据库表中的字段不可再分,是唯一的一个。例如,现在有如下的一张表:
CREATE TABLE person(
perid NUMBER PRIMARY KEY ,
name VARCHAR2(50) ,
address VARCHAR2(250)
) ;
现在以上的一张表中,设计是否存在问题?
实际上有一些问题,地址信息太大了,还可以进一步的划分,分为邮政编码、具体的地址、地区、子地区。
CREATE TABLE person(
perid NUMBER PRIMARY KEY ,
name VARCHAR2(50) ,
zipcode VARCHAR2(50) ,
area VARCHAR2(50) ,
subarea VARCHAR2(50) ,
address VARCHAR2(250)
) ;
所以,以上的设计就相当于合理一些,那么,对于第一范式也有一些注意点。
CREATE TABLE person(
perid NUMBER PRIMARY KEY ,
name VARCHAR2(50) ,
zipcode VARCHAR2(50) ,
area VARCHAR2(50) ,
subarea VARCHAR2(50) ,
address VARCHAR2(250) ,
biryear NUMBER ,
birmonths NUMBER ,
birday NUMBER
) ;
对于生日来讲应该是一个完整的日期,但是以上的做法太细了。所以此种设计是不合理的。
7.1.2 范式二
数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
CREATE TABLE selectcourse(
stuno NUMBER ,
stuname VARCHAR2(50) ,
stuage NUMBER ,
cname VARCHAR(50) ,
stugrade NUMBER ,
credit NUMBER
) ;
以上的设计完全符合于第一范式,但是不符合于第二范式,因为以上表的字段存在着依赖的关系。
INSERT INTO selectcourse(stuno,stuname,stuage,cname,stugrade,credit) VALUES (1,'zhangsan',20,'java',89,3) ;
INSERT INTO selectcourse(stuno,stuname,stuage,cname,stugrade,credit) VALUES (2,'lisi',20,'java',79,3) ;
INSERT INTO selectcourse(stuno,stuname,stuage,cname,stugrade,credit) VALUES (1,'zhangsan',20,'oracle',78,3) ;
以上代码的问题:
• 数据冗余:学生信息、课程信息
• 假设课程信息修改了,则要同时修改多条
• 如果一门课程一个学生都没有参加,则此课程将不存在。
要想解决以上的问题,则需要进行进一步的表的细分,分出实体表和关系表。
CREATE TABLE student(
stuno NUMBER PRIMARY KEY ,
stuname VARCHAR2(50) ,
stuage NUMBER
) ;
CREATE TABLE course(
cid NUMBER PRIMRAY KEY ,
cname VARCHAR(50) ,
credit NUMBER
) ;
以上建立了两张实体表,实体表建立完成之后,下面必须设置出关系。
一个学生可能选多门课程,一门课程会有多个学生参加。
CREATE TABLE selectcourse(
stuno NUMBER ,
cid NUMBER ,
stugrade NUMBER ,
CONSTRAINT student_selectcourse_stuno_fk FOREIGN KEY(stuno) REFERENCES student(stuno) ON DELETE CASCADE ,
CONSTRAINT student_selectcourse_cid_fk FOREIGN KEY(cid) REFERENCES course(cid) ON DELETE CASCADE
) ;
此时,更新学生信息或更新课程信息都非常的方便。在关系表中将两个实体进行关联的配置。
以上实际上属于多对多的设计关系。
7.1.3 范式三
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)
按照第二范式,设计出两张表。
CREATE TABLE student(
stuno NUMBER PRIMARY KEY ,
stuname VARCHAR2(50) ,
stuage NUMBER
) ;
CREATE TABLE school(
sid NUMBER PRIMRAY KEY ,
sname VARCHAR(50) ,
loc VARCHAR2(50) ,
tel VARCHAR2(50)
) ;
CREATE TABLE studentschool(
stuno NUMBER ,
sid NUMBER ,
CONSTRAINT student_studentschool_stuno_fk FOREIGN KEY(stuno) REFERENCES student(stuno) ON DELETE CASCADE ,
CONSTRAINT student_studentschool_sid_fk FOREIGN KEY(sid) REFERENCES school(sid) ON DELETE CASCADE
) ;
以上的设计符合于第二范式,但是会存在那些问题?
一般情况下,一个学生基本上就在一个学院待着,那么如果按照以上的设计,一个学生可以同时待在多个学院,一个学院会有多个学生。
那么,此时明显不符合具体的要求。Oracle中存在雇员和部门的关系。
CREATE TABLE school(
sid NUMBER PRIMRAY KEY ,
sname VARCHAR(50) ,
loc VARCHAR2(50) ,
tel VARCHAR2(50)
) ;
CREATE TABLE student(
stuno NUMBER PRIMARY KEY ,
stuname VARCHAR2(50) ,
stuage NUMBER ,
sid NUMBER ,
CONSTRAINT student_school_sid_fk FOREIGN KEY(sid) REFERENCES school(sid)
) ;
所以,以上的做法实际上是一种一对多的关系,在实际的开发中一对多也是出现最多的一种设计思路。
但是,以上的三种范式,只能作为参考使用,开发中如果全部按照此范式操作也会存在问题。
开发中的操作范式只有一个原则:减少复杂的查询SQL语句,减少表的关联查询。
8.1 PowerDesigner工具的使用
在进行数据库的分析和设计中,基本上都要使用一些设计的工具,那么设计工具中有一个称为PowerDesigner的设计,此工具使用最为广泛,此工具是Sybase公司出品的。
建立数据库模型
9.1 过程与函数
发表评论
-
本小姐回来啦 —— 超级感谢MLDN
2009-08-10 13:24 1600我又回来了!哈哈,报告一个好消息,我已经成功入职博彦科 ... -
现在开始积极的找工作
2009-07-05 19:13 1174学习差不多了,得赶在毕业前找到一个工作啊,本小姐这段时 ... -
素质教育 —— 模拟面试
2009-06-30 19:10 1043今天一天都安排了职业素质的培养,包括简历的指导、技术面 ... -
EJB实体Bean开发的复合主键映射
2009-06-29 21:36 1685复合主键的映射:在Hibernate中是通过一个主键类来完成复 ... -
EJB实体Bean开发
2009-06-29 21:33 988EJB实体Bean开发的数据库连接采用数据源连接池的方式,因此 ... -
EJB3.0
2009-06-28 14:14 1228EJB是SUN公司提出的开发 ... -
JBoss服务器配置
2009-06-25 21:21 2079哦,哦,哦,EJB的准备课程啊。 这里开发使用的是 JB ... -
Spring结合iBATIS进行开发
2009-06-25 21:19 960使用Spring管理iBATIS完全可以参照Spring+Hi ... -
ibatis开发框架
2009-06-25 21:17 1254iBATIS为一个ORMapping框架,可以帮助开发人员完成 ... -
WebService分布式开发
2009-06-24 22:23 1904WebService:用来跨语言传递数据。 数据交互是通过XM ... -
北京下雨了
2009-06-18 19:56 771上次在公交车上,听到电视里放《北京下雨了》,那么北京今天 ... -
JQuery
2009-06-10 21:03 12581、JQuery的基本语法 ... -
AJAX中使用JSON
2009-06-10 21:02 1301在Java开发中,如果要使用JSON进行开发,需要一些支持,这 ... -
AJAX框架 —— JSON基本知识
2009-06-10 21:01 941我真想知道这年头到底有多少种框架。 1、JSON ... -
还应该多帮助同学,才能让自己进步快
2009-06-08 21:57 986今天对于本小姐来讲还真是相对轻松的一天啊,上周完成了任 ... -
业务、业务、业务。。。
2009-06-03 18:41 1142项目就是业务,项目中都是业务,技术就这么点东西,只要把 ... -
IBM Project 继续中ing....
2009-06-02 19:08 872项目就是要坚持的做下去,而且要想到做到最好,虽然框架很好 ... -
实际开发了
2009-06-01 18:17 877今天开始新的项目了,项目老师帮我们搭建好了SVN服务器, ... -
web学习笔记 —— 数据源
2009-05-31 19:56 1019使用数据源可以提升数据库的操作性能,当然,不管使用与否,对于程 ... -
SSH(Spring + Struts + Hibernate)
2009-05-31 19:47 2488Spring结合Hibernate ...
相关推荐
继续课堂笔记 继续课堂笔记继续课堂笔记继续课堂笔记继续课堂笔记继续课堂笔记继续课堂笔记继续课堂笔记继续课堂笔记v
C++学习笔记C++学习笔记C++学习笔记C++学习笔记C++学习笔记
印象笔记共享笔记本图文教程 印象笔记是一款功能强大且好用的笔记软件,允许用户创建、组织和分享笔记。很多用户都想知道如何共享笔记本,以便与他人共同编辑和查看笔记。在这里,我们将详细介绍印象笔记共享笔记本...
红头发CCNA笔记红头发CCNA笔记红头发CCNA笔记
**标题详解:** "AA1FanControl宏基笔记本散热风扇控制软件" 是一款专为宏基(Acer)品牌笔记本电脑设计的散热管理工具。这款软件的主要功能是帮助用户精细控制笔记本电脑的散热风扇,以达到调整风扇转速、降低噪音的...
有道云笔记窗口大小调整技巧 在使用有道云笔记时,调整窗口大小是非常重要的操作。合理的窗口大小设置可以提高工作效率和阅读体验。本文将介绍如何调整有道云笔记的窗口大小,提高笔记编辑和阅读体验。 一、调整...
java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记
docker笔记笔记笔记笔记笔记笔记
个人强烈推荐的电子笔记,用过各种, 这个最强大。
有道笔记本桌面版是网易有道出品的电子笔记本软件。 特色功能: 1.自动增量同步 2.按照笔记本来整理笔记 3.富文本编辑笔记,可...5.邮件功能发送笔记,快速分享笔记内容。 6.密码保护锁定窗口,保护用户隐私安全。
笔记记录分享-笔记记录分享网站-笔记记录分享网站源码-笔记记录分享网站java代码-笔记记录分享网站设计与实现-基于springboot的笔记记录分享网站-基于Web的笔记记录分享网站设计与实现-笔记记录分享项目-笔记记录...
微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小...
ES6笔记笔记笔记笔记笔记
狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神...
oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记...
本资源是关于高手笔记 软件开发软件使用笔记的知识点总结。主要讲解了如何构建带内存错误检查的 gcc,以及 QEMU 的使用笔记。 一、构建带内存错误检查的 gcc 高手笔记软件开发软件使用笔记中提到一个用于内存错误...
陈文灯数学笔记 陈文灯数学笔记陈文灯数学笔记陈文灯数学笔记陈文灯数学笔记
杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代...
小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+...
基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip 基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip 基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip...