第五天,状态调整完毕

  李兴华老师在第一天的时候曾经说过,第一个星期的教学就是跟大家磨合,果然不错,从昨天开始已经开始习惯了老师的风格,虽然不知道其他人怎么想,但是我想,这才应该是一个好老师。



今天所讲的知识点
A 用户管理
B 嵌套表
C 可变数组
D PL/SQL编程
E 数据库范式


我对知识点的分析
A 提示:对用户的修改设置,往往需要重新连接才能生效。
一、创建用户
在创建用户的时候需要有管理员的权限,可以使用sys用户登陆,创建用户。
创建用户的语法:
CREATE USER 用户名 IDENTIFIED BY 密码 ;
二、给用户授权
在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 ;
三、收回用户的授权
REVOKE 权限名  FROM 用户 ;
例如:REVOKE SELECT,DELETE ON scott.emp FROM test ;
四、修改用户密码
ALTER USER 用户名 IDENTIFIED BY 密码 ;
例如:将test用户的密码修改为hello
ALTER USER test IDENTIFIED BY hello ;
五、使用户密码失效
ALTER USER 用户名 PASSWORD EXPIRE ;
六、用户锁定与解锁
ALTER USER 用户名 ACCOUNT  LOCK ;
ALTER USER 用户名 ACCOUNT  UNLOCK ;

B 如果要想完成,则首先第一步需要定义出一种数据类型,此类型表示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) ;

C 可变数组属于嵌套表的升级版,在可变数组中,实际上就是将内部的嵌套表的内容的长度进行了限制。
例如:一个部门有多个工人。如果按照可变数组的做法,肯定首先要做出一个工人的类型。
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,'李四','女')
)) ;

D 在Oracle中本身也有自己的程序设计,那么这种程序设计就是使用PL•SQL完成,例如,定义过程(存储过程)、游标、触发器、函数、包等等。
但是从现代的开发角度来讲,以上的程序的作用基本上已经没有了。
如果要想使用一个PL•SQL块,则必须按照以下的格式进行:
DECLARE
-- 程序的声明部分,例如,定义变量
BEGIN
-- 程序的执行体,具体的操作代码
EXCEPTION
-- 异常的处理
END ;
/
一、输入输出
  (1)赋值  :=
(2)输出:DBMS_OUTPUT.put_line('变量:' || i) ;
(3)输入:  &
二、分支结构
(1)单分支结构
IF  … THEN
…..
END IF
(2)双分支结构
IF  … THEN
…..
ELSE
………
END IF
(3)多分支结构
IF  … THEN
…..
ELSIF …
………
END IF
(4)CASE分支
PL/SQL中CASE的用法有两种结构:
(1)检测式,有一个检测表达式,每个WHEN中的值与其相比较。
 语法:
[ <<label_name>> ]
CASE case_operand
  { WHEN when_operand THEN {statement;} ... }...
  [ ELSE {statement;}... ]
END CASE [ label_name ];
 说明:
 case_operand是被检测的变量或表达式,可以是任意复杂的表达式,可以包含函数调用,只在开始执行CASE语句时计算一次。
 when_operand的类型必须与case_operand的类型相符。
 没有ELSE子句的CASE语句,如果case_operand与任何一个when_operand都不匹配时,PL/SQL将产生预定义错误CASE_NOT_FOUND,错误号为ORA-6592。
 示例:
SET SERVEROUTPUT ON;
DECLARE
  v_day INTEGER:=3;
  v_cday VARCHAR2(10);
BEGIN
  CASE v_day
    WHEN 1 THEN v_cday:='星期一';
    WHEN 2 THEN v_cday:='星期二';
    WHEN 3 THEN v_cday:='星期三';
    WHEN 4 THEN v_cday:='星期四';
    WHEN 5 THEN v_cday:='星期五';
    WHEN 6 THEN v_cday:='星期六';
    WHEN 7 THEN v_cday:='星期日';
    ELSE v_cday:='非预期数据';
  END CASE;
  DBMS_OUTPUT.PUT_LINE(v_cday);
END;

对比

SET SERVEROUTPUT ON;
DECLARE
  v_day INTEGER:=3;
  v_cday VARCHAR2(10);
BEGIN
  v_cday:=CASE v_day
    WHEN 1 THEN '星期一'
    WHEN 2 THEN '星期二'
    WHEN 3 THEN '星期三'
    WHEN 4 THEN '星期四'
    WHEN 5 THEN '星期五'
    WHEN 6 THEN '星期六'
    WHEN 7 THEN '星期日'
    ELSE '非预期数据'
  END;
  DBMS_OUTPUT.PUT_LINE(v_cday);
END;
(2)搜索式,没有检测表达式,每个WHEN中都包含一个布尔表达式。
 语法:
[ <<label_name>> ]
  CASE { WHEN boolean_expression THEN {statement;} ... }...
  [ ELSE {statement;}... ]
END CASE [ label_name ];
 示例:
SET SERVEROUTPUT ON;
DECLARE
  v_day INTEGER:=3;
  v_cday VARCHAR2(10);
BEGIN
  CASE
    WHEN v_day=1 THEN v_cday:='星期一';
    WHEN v_day=2 THEN v_cday:='星期二';
    WHEN v_day=3 THEN v_cday:='星期三';
    WHEN v_day=4 THEN v_cday:='星期四';
    WHEN v_day=5 THEN v_cday:='星期五';
    WHEN v_day=6 THEN v_cday:='星期六';
    WHEN v_day=7 THEN v_cday:='星期日';
    ELSE v_cday:='非预期数据';
  END CASE;
  DBMS_OUTPUT.PUT_LINE(v_cday);
END;

对比

SET SERVEROUTPUT ON;
DECLARE
  v_day INTEGER:=3;
  v_cday VARCHAR2(10);
BEGIN
  v_cday:=CASE
    WHEN v_day=1 THEN '星期一'
    WHEN v_day=2 THEN '星期二'
    WHEN v_day=3 THEN '星期三'
    WHEN v_day=4 THEN '星期四'
    WHEN v_day=5 THEN '星期五'
    WHEN v_day=6 THEN '星期六'
    WHEN v_day=7 THEN '星期日'
    ELSE '非预期数据'
  END;
  DBMS_OUTPUT.PUT_LINE(v_cday);
END;
三、循环结构
(1)LOOP循环
LOOP
语句 ;
EXIT WHEN (退出条件) ;
循环变量改变 ;
END LOOP;
(2)WHILE …LOOP循环
WHILE (条件) LOOP
语句 ;
改变循环变量;
END LOOP ;
(3)FOR…LOOP循环
FOR 循环变量 IN 起始点..终止点 LOOP
  语句
END LOOP;
E 范式一:
字段不可分
范式二:
多对多表
范式三:
一对多表
F
备注:

A 设计要求,要求设计一个网上购物程序(使用powerdesigner建立模型并编写测试数据),有以下的需求
1、 管理员可以在后台添加商品,每个商品属于一个商品组
2、 可以对管理员进行分组,对每一组进行分别授权,即一个管理员组可以有多个管理员,一个管理员组有多个权限,一个管理员可以在多个组
3、 用户可以自己购买商品,购买商品时要在定单表中添加信息,一个用户可以同时购买多个商品,用户可以选择自己所在的地区进行商品的派送
4、 用户可以根据自己的购买积分,对商品进行折扣。
个人收获:
学会了从实体表、关系表分析数据库的表;
从中体会到数据库的范式并不一定非得遵守,或者说完全遵守数据库的范式设计的数据库模型不一定是最好用的,特别在涉及复杂查询的时候;



第一周的培训就这样坚持过来了,从一开始精神紧绷,到现在已经基本适应了。
不过这一周我觉得自己的学习方法还是不够好,所以学习效率不是很高,每一天弄得自己很晚睡觉,但似乎其实可以不用熬夜的,这样又导致第二天学习比较累,偶尔会出现脑子空白的情况。
而且我这一周学习没有去提前预习,只是做好了复习的工作,时间就不多了。
希望下周学习JAVA后,需要调整一下学习方法。

你可能感兴趣的:(数据结构,oracle,sql,编程,项目管理)