Oracle体系结构:
物理存储结构:
控制文件:
维护数据库的全局物理结构,用以支持数据库成功地启动和运行。只要数据库是打开的,控制文件必须处于可写状态。如果控制文件不能被访问,那么数据库也不能正常工作。
控制文件存储了数据库名,数据库的数据文件和联机重做日志文件的名称和位置,数据库建立日期,数据库检查点,数据库当前序列号,数据库中表空间名等信息。
每个数据库可包含两个或多个控制文件。
.CTL
后缀结尾
数据文件:
物理存储Oracle数据库数据的文件。包括用户数据和系统数据。用户数据用来存放用户对象(表,索引),系统数据指数据字典中的数据。
一个Oracle数据库有多个数据文件,一个数据文件对应一个数据库。
.DBF
结尾
重做日志文件:
专门记录用户对数据库的所有修改,一旦数据库出现问题(断电,死机),可以利用重做日志文件将数据库恢复到一个正确的状态。用于记录对数据库的所有修改,修改信息包括用户对数据的修改,以及管理员对数据库结构的修改。
每个数据库至少包含两个重写日志文件组
每个重写日志文件成员对应一个物理文件。
重写日志文件以
循环方式
进行写操作。
.log
结尾
初始化参数文件,口令文件,归档日志文件
逻辑存储结构:
逻辑存储结构由表空间,段,区,数据块组成。
块组成区,区组成段,段组成表空间,表空间组成数据库。
- 增强Oracle数据库可移植性
- 降低Oracle数据库使用者的操作难度
- 增加数据的使用安全性
表空间:
Oracle数据库最大的逻辑结构。一个数据库在逻辑上由多个表空间组成,一个表空间只隶属于一个数据库。表空间在物理说包含一个或多个数据文件
Oracle数据库中表空间的个数决定了数据文件的最小个数。
区:
区由一组连续的
Oracle数据块
组成。一个段由若干个区组成,当创建一个段时(如创建一个表时),系统会在相应表空间中找到空闲区为该段分配空间。块:
块是数据库中最小,最基本的存储单位。数据块的基本结构由块头部,表目录,行目录,空闲空间,行空间等几部分组成
数据库实例也称作服务器,由系统全局区(SGA)和后台进程组成,
实例用来访问数据库且只能打开一个数据库,一个数据库可以被多个实例访问
内存结构
内存是Oracle重要的信息缓存区和共享区。
Oracle使用的主要内存结构:
-
SGA:系统全局区。可以被所有用户共享。
数据块缓冲区:数据库数据高速缓存区。目的:为了缓存操作的数据,从而减少系统读取磁盘的次数
字典缓存区:当数据库需要读取存储在数据字典中的对象信息时,需要将该信息存储在字典缓存区中。
重做日志缓冲区:数据恢复
共享池:由库缓存区和数据字典高速缓存区两部分组成,存储最近使用过的数据定义,最近执行过的SQL命令,以便共享
-
PGA:程序全局区。保存单个进程的绘画数据和控制信息。内容为指定服务器进程所专用,不能被其他服务器进程所共享。
进程结构
进程是操作系统中一个独立的可以调度的活动,用于完成指令的任务。
- 用户进程:为运行用户应用程序或Oracle工具所建立的进程。
- 服务器进程:处理用户进程的各种请假。
- 后台进程:DBWR(数据库写入进程),LGWR(日志写入进程),SMON(系统监控进程),PMON(进程监控进程),CKPT(检查点进程)
数据库例程
也叫实例,每一个运行的Oracle数据库都有一个对应的实例。由系统全局区和一些后台进程组成。
一个数据库可以由多个实例打开,一个实例只能打开一个数据库。
多个实例可以同时运行在同一个机器上。它们彼此访问各自独立的物理数据库。
当实例启动后,Oracle会把这个实例和对应的物理数据库关联起来。这个过程叫“加载”(Mounting)。这个时候数据库将处于准备打开的状态。只有管理员能关闭
数据库例程启动和关闭:
STARTUP
SHUTDOWN
PL/SQL
基本结构:块
组成部分:声明部分,可执行部分,错误处理部分
声明常量时必须加关键字CONSTANT,常量在声明时必须初始化,否则在编译时会出错。
变量名 [CONSTANT] 数据类型 [NOT NULL][:= | DEFAULT PL/SQL表达式]
数据类型:标量类型,参考类型,LOB类型和用户自定义类型
- 标量类型:
- 数值型NUMBER,
- 字符型(CHAR定长,VARCHAR2 变长),
- 日期型DATE(DD-MON-YY)
- 布尔型 BOOLEAN
- 参考型
- %TYPE,定义一个变量,其数据类型可以与已经定义的某个数据变量的类型相同,或者和数据表某一列的数据类型相同
- %ROWTYPE:前面是表名或者游标名
[DECLARE]
[BEGIN]
[EXCEPTION]
END;
set serveroutput on;
begin
DBMS_OUTPUT.PUT_LINE('我喜欢');
DBMS_OUTPUT.PUT_LINR("haha");
end;
DECLARE
v_length NUMBER:=&length;
v_width NUMBER:=&width;
v_area NUMBER;
BEGIN
v_area:=v_width*v_length;
DBMS_OUTPUT.PUT_LINE('该长方形的面积为:'||v_area);
END:
DECLARE
v_length NUMBER:=&length;
v_width NUMBER:=&Width;
v_area NUMBER;
BEGIN
DECLARE
v_cir NUMBER;
BEGIN
v_cir:=(v_length+v_width)*2;
DBMS_OUTPUT.PUT_LINE('子块中,该长方形的周长为:'||v_cir);
END;
v_area:=v_width*v_length;
DBMS_OUTPUT.PUT_LINE('主块中,该长方形的面积为:'||v_area);
END;
Declare
v_sc sc%rowtype; /*v_sc参考sc表中记录的类型*/
begin
v_sc.sno:='20180001';
v_sc.cno:='c2';
v_sc.grate:=95;
insert into sc
valuse(v_sc.sno, v_sc.con, v_sc.grate);
end;