Oracle数据库(Oracle存储结构、Oracle运行机制、日期相关的函数、序列、大对象数据类型、表的修改与约束、事务)

本文主要是介绍Oracle数据库(Oracle存储结构、Oracle运行机制、日期相关的函数、序列、大对象数据类型、表的修改与约束、事务),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仅仅只是阅读浏览博客内容学习Oracle这种方式不行,更重要的是敲代码,推荐博客中代码建议阅读本博客的人去手动的敲一下代码!
推荐博客:

http://blog.csdn.net/ochangwen/article/details/52214713

一、Oracle存储结构

在了解Oracle物理存储结构之前,首先了解一些表空间和数据库的结构组成。表空间是一个数据库被分成若干个逻辑单元,每一个逻辑单元称为表空间,在关系型数据库中,所有的数据都是放在表中,表放在表空间中。数据库在物理上是有若干个文件组成,逻辑上,由若干个表空间组成,表物理上是放在数据文件中的,逻辑上放在表空间上的。

Oracle的存储结构分别介绍物理存储结构和逻辑存储结构。

数据库的物理存储结构:包括一些文件,其中文件主要由下面三种文件组成:

数据文件(*.dbf DatabaseFiles):存放数据,存放表(Segment段)

控制文件(*.ctl Control):数据库物理结构的仓库,用于存放数据库物理结构信息。

转储:alter database backup controlfile to trace(转储的目的是为了打开上述几种后缀名文件的时候,找不到合适的文件编译器,所以利用转储将文件转为能打开的格式。)

重做日志文件(*.log):存放每一次堆数据库的改变

数据库的逻辑结构

表空间,表的容器,由若干个段组成,每一个段对应一个表,存放表数据,由若干个区组成,每个区为一个表中的一行,是一块连续的存储空间,由若干个块组成,其中块是表中的一列,Oracle中最小的存储单位。关于段分为:数据段和回滚段;其中数据段用于存放普通的表的数据(create
table 创建出来的表就是普通表)创建表的实质就是创建数据段。回滚段是用于存放回滚数据,回滚数据是修改前的数据,即原数据。

二、Oracle运行机制

(在这里知识简单说一些问题,推荐博客:http://blog.chinaunix.net/uid-20274021-id-1969353.html)

先来一张Oracle数据库中写数据的运行过程:
这里写图片描述

在Oracle中存在实例这个概念,实例由一系列为当前数据库提供服务的内存和后台进程,内存和服务进程的集合成为一个实例。数据库高速缓冲区(Database Buffer Cache)用于存放从数据文件中读取的数据,Oracle查数据时,先从高速缓冲区中查找数据,如果找到了,直接取出来,如果没找到,则从磁盘数据文件中取,然后放到高速缓冲区。

Oracle修改数据时,先查,放到高速缓冲区中,然后修改高速缓冲区数据。关于这个操作中,存在两个文件,(1)是谁把修改的数据写入硬盘数据文件中的?(2)什么时候执行把修改的数据写入硬盘数据文件中?

问题(1)、DBWn—Darabase Writer Process(这个进程可以有多个,即DBW0,DBW1,DBW2…)(数据库书写进程,负责把数据库高速缓冲区中的数据书写到磁盘数据文件中)

问题(2)、先介绍几个概念:脏缓冲器(原先缓冲器中的数据被改变了),冷缓冲器(最近最少使用的缓冲器),脏数据(内存中改变后的数据,与数据库存储的不一致数据)。当缓冲器又脏又冷时,将脏冷缓冲器写入数据文件中。缓冲器会重新变得干净(意味着可重新3往该缓冲器内存放数据)。当缓冲器不够用时,关于缓冲区的分配和清空策略,请再重新查找资料。

注意一点:事务提交了,被修改的数据不一定要被写入数据文件中。事务没提交,但被修改数据已经写入数据文件。这两种情况都有可能发生,具有不确定性。

重做日志缓冲器–Redo Log Buffer(用于存放堆数据库的修改)
问题(1):谁把修改的日志写入重做日志中?问题(2):什么时候将修改的日志写入重做日志中?

问题(1)、LGWr-Log Writer Process(日志书写进程,负责把日志缓冲区中的内容书写到重做日志文件中)

问题(2)、当提交事务时、每隔3秒、日志缓冲区满1/3、DBWr将修改的数据写到磁盘数据文件中时,日志书写进程就会执行。重做日志文件中,有一个标志,用于表示操作属于哪个事务,事务有没有提交。

三、Oracle中日期相关的函数

符合Oracle默认显示日期格式(dd-mon-yy)的字符串可以自动转换为date类型,返回服务器当前时间和日期。
sysdate返回date
systimestamp返回timestamp

(1)to_char(date,format)将日期转换为格式化的字符串

参数介绍:format:年:yyyy/yyy/yy/y/''
月:mm简写月,mon全称月
日:dd当前月的第几天,ddd当前年的第几天
时:hh24 24小时制度,0-23; hh12/hh 12小时制,1-12
分:mi
秒:ss

(2)to_date(str, format)将一个日期的字符串转换成默认显示的日期格式的数据

format参照to_char()函数。

四、序列(Sequence)

序列是Oracle对象,用于生成连续的证书,Oracle没有自增长的类型,所以需要用到序列来实现自增长。
创建序列的语法:

create sequence 序列名
[start with num(从哪个值开始,升序默认1,降序默认-1)]
[increment by num(每次增长的数值,默认为1,正数表示升序,负数表示降序)]
[maxvalue num | nomaxvalue]
[minvalue num | nominvalue]
[cycle | nocycle]
[cache num | nocache]
maxvalue num 指定该序列最大能的值,默认nomaxvalue,升序时默认10^27,降序时默认-1;
minvalue num 指定该序列能取到的最小值,默认nominvalue,升序时默认1,降序时默认-10^26;
序列取值范围[minvalue,maxvalue]
cycle表示循环取值升序:达到最大值后从最小值开始重新取;降序:达到最小值后从最大值开始重新取。如果没有指定cycle,默认值:nocycle,不循环
cache num预先生成一些值,存放在缓存中,需要值的时候从缓存中取 用于指定缓存的序列的值的个数,默认20
每个表都有自己的序列,用于生成自己的逻辑主键值
nextval 用于获取序列的下一个值
currval 用于获取序列的当前值**注意:调用currval之前,至少调一次nextval**

五、大对象数据类型

 blob – Binary Large Object 二进制大对象,保存二进制数据,数据的插入操作依赖于编程语言clob – Character Large Object文本大对象10g:4G11g:128T

六、表的修改与约束

1、表的一些常见修改:

添加新的列定义
alter table 表名 add(列名 类型,...);
修改列的类型
alter table 表名 modify(列名 类型,...);
重命名列名       
alter table 表名 rename column 旧列名 to 新列名;
删除表的列
alter table 表名 drop column 列名;
修改表名    
rename 旧表名 to 新表名;
删除表
drop table 表名 [cascade contraint];
cascade contraint 级联删除外键约束,不删列
复制表:根据查询结果创建一个表
create table 表名 as select语句;
根据查询结果,往指定表中插入数据
insert into 表名 select语句;

2、表的约束

约束某个字段能保存什么样的数据。
列级约束:在定义列的同时指定约束,[constraint 约束名] 约束内容
表级约束:在列定义完后,再指定的约束,[constraint 约束名] 约束内容(制定列)

常见约束:

    主键约束列级:primary key表级:primary key(列名)外键约束列级:references 表名(列名)     ––  mysql中不起作用表级:foreign key (当前表列名) references 另一个表名(取值唯一的列/主键的列名);唯一约束:列级:unique表级:unique(列名)非空约束:列级:not null表级:无检查约束:mysql不支持检查约束,约束不起作用列级:check(条件)表级:check(条件)

修改约束

    not null – 列级alter table 表名 modify(列名 类型 not null);null – 列级alter table 表名 modify(列名 类型 null);添加主键约束、唯一约束、检查约束 – 表级格式:alter table 表名 add [constraint 约束名] 约束内容;alter table 表名 add primary key(列名);alter table 表名 add unique(列名);alter table 表名 add check(条件);添加外键约束 – 表级alter table 表名 add [constraint 约束名] foreign key (当前表列名) references 另一个表名(取值唯一的列/主键的列名);

删除约束

   alter table 表名 drop constraint 约束名;

外键约束

   列级:foreign key on delete cascade 表级:foreign key(列名) references 表名(列名) on delete cascadeon delete cascade 删除主表记录时,级联删除所有关联的子表记录

七、事务

推荐博客:http://blog.csdn.net/junmail/article/details/5556561
http://www.cnblogs.com/god-S/p/4709044.html
http://www.cnblogs.com/ITtangtang/archive/2012/04/23/2466554.html

事务:一组不可分的操作,由若干个一次操作组成(例如转账操作),这些操作要么同时成功,要么同时失败,事务的特性:ACID,
原子性 Atomicity
一致性 Consistency
隔离性 Isolation
永久性 Durability

事务常见操作:

开启事务:关闭/开启自动提交:set autocommit off | on;提交事务commit;回滚事务rollback; 回滚到最后一次commit后状态rollback to 回滚点名;truncate table 表名;DDL,删除表的数据,截断表;先删表再建表;
设置回滚点取数据:取数据之前会判断,要取的数据是否正在被一个事务操作,就会从这个事务的回滚段中取数据;如果没有被事务操作,先内存后数据文件回滚段 Undo Segment ,用于存放回滚数据 Undo Data,修改之前的原数据,回滚段在回滚表空间,回滚表空间数据文件:undoxxx.dbf一个事务开启,系统会为他分配对应的回滚段,事务提交或回滚后自动释放

Oracle事务控制:

oracle中的事务是隐式自动开启,它不需要用户显式地使用语句开启事务处理,当发生如下情况时,oracle认为一个事务结束:(1)、执行commit语句提交事务;(2)、执行rollback语句撤销事务;(3)、执行一条数据定义语句(例如greae、drop、alter语句等)。如果该语句执行成功,那么表示系统自动执行commit命令;如果操作失败,那么表示系统自动执行rollback命令;(4)、执行一个数据控制命令(例如grant、revoke等),这种操作表示自动执行commit命令;(5)、断开数据库的连接。如果使用exit命令正常退出SQL*Plus,则系统自动执行commit命令;如果退出出现异常,则系统自动执行rollback命令。

Oracle的锁

 oracle可以提供最小的行级锁,在oracle中,锁的资源占用非常小,所以oracle默认开启事务,直到提交或回滚。行级锁之前需要先加表结构共享锁行级排他锁阻止两个事务对同一行数据同时修改被锁定行不可进行修改、删除     一个事务修改某一行数据时,要先获得这一行的行级锁,之后才能修改这行数据事务提交或回滚后会释放行级锁表级共享锁对所有事务来说,对表的查询是共享的阻止修改表结构独占表级锁时,才能修改表结构select … for updatefor update,指定查询去获取最新的数据,取某一行数据之前,要获得数据行的行级锁

这篇关于Oracle数据库(Oracle存储结构、Oracle运行机制、日期相关的函数、序列、大对象数据类型、表的修改与约束、事务)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143608

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque