您的位置:首页 > 数据库 > Oracle

Oracle学习2

2015-06-15 14:46 691 查看

oracle的事务

//小技巧

1 当使用value子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据

当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据

举例:insert into test values(myid,myname,mydept) select empno,ename,deptno from emp;

2 使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据

举例:希望员工Scott的岗位、工资、补助与smith员工一样

update emp set (job,sal,comm)=(select job,sal,comm from emp where ename=’smith’) where ename=’scott’;

1 什么是事务

事务是用于保证数据的一致性,它由一组相关的dml(增、删、改)语句组成,要么该组dml语句全部成功,要么全部失败

当执行事务操作时,oracle会加上锁

2 提交事务(exit退出,自动提交)

当使用commit语句后,会确认事务的变化、结束事务、删除保存点,释放锁

3 回退事务(一定要保证没有commit)

保存点是事务中的一点,用于取消部分事务,当结束事务时,会自动删除该事务所定义的所有保存点,当执行rollback时,通过指定保存点可以回退到指定的点

save point a1;

进行一系列操作,如删除

delete from emp where ename=”;

save point a2;

又进行一系列操作

取消部分事务rollback to a1; //取消全部事务:rollback

4 在Java程序中如何使用事务

转账:从一个账户减去10元,在另一个账户加上10元

//1.加载驱动

Class.forName(“oracle.jdbc.driver.OracleDriver”);

//2.得到链接

Connection ct=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:myoral(IP地址+端口号+数据库实例)”,”scott”,”m123”);

//3

Statement sm==ct.createStatement();

//从Scott中减去100,在给smith加100

sm.executeUpdate(“update emp set sal=sal-100 where ename=’scott’”);

int i=7/0; 这样的话执行完第一句后,就执行不了加钱的操作了,会抛异常了,但前面减钱的操作却自己执行了

sm.executeUpdate(“update emp set sal=sal+100 where ename=’smith’”);

//关闭打开的资源

sm.close();

ct.close();

解决方案:加入事务处理

//1.加载驱动

Class.forName(“oracle.jdbc.driver.OracleDriver”);

//2.得到链接

Connection ct=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:myoral(IP地址+端口号+数据库实例)”,”scott”,”m123”);

//加入事务处理

ct.setAutoCommit(false); 这样的话不会执行一句话提交一句话,由自己控制提交时间,假如抛出异常,那么重新在抛异常的函数那添加回滚命令

//3

Statement sm==ct.createStatement();

//从Scott中减去100,在给smith加100

sm.executeUpdate(“update emp set sal=sal-100 where ename=’scott’”);

int i=7/0; 这样的话执行完第一句后,就执行不了加钱的操作了,会抛异常了,但前面减钱的操作却自己执行了

sm.executeUpdate(“update emp set sal=sal+100 where ename=’smith’”);

//提交事务

ct.commit();

//关闭打开的资源

sm.close();

ct.close();

5 只读事务

只读事务只 允许执行查询的操作,不能执行其他dml操作的事务

设置只读事务:set transaction read only

oracle的函数

1 字符函数

lower(chaer):将字符串转化为小写的格式

upper(char):将字符串转换为大写的格式

length(char):返回字符串的长度

substr(char,m,n):取字符串的子串 从m开始取,取n个字符

replace(char1,search_string,replace_string)

instr(char1,char2,[,n[,m]])取子串在字符串的位置

如:将所有员工的名字按小写的方式显示

sql>select lower(ename) from emp;

如:显示正好为5个字符的员工的姓名

sql>select ename from emp where length(ename)=5

如:显示所有员工的前三个字符

sql>select substr(ename,1,3) from emp;

如:以首字母大写的方式显示所有员工的姓名

完成首字母大写 sql>select upper(substr(ename,1,1)) from emp;

完成后面字母小写 sql>select lower(substr(ename,2,1ength(ename)-1)) from emp;

合起来:sql>select upper(substr(ename,1,1)) || lower(substr(ename,2,1ength(ename)-1)) from emp;

2 数学函数

round(n,[m]):用于执行四舍五入,如果省掉m,则四舍五入到整数;如果m是正数,则四舍五入到小数点的m位后;如果m是负数,则四舍五入到小数点的m位前

trunc(n,[m]):用于截取数字,如果省掉m,就截去小数部分;如果m是正数,就截取到小数点的m位后;如果m是负数,就截取到小数点的前m位(66.2,-1)=60;

mod(m,n):m/n 取余

floor(n):返回小于或是等于n的最大整数

ceil(n):返回大于或是等于n的最小整数

abs(n):返回数字n的绝对值

如:算工资,每个函数算出来都有差距

sql>select (round(sal)+round(comm))*13 from emp where ename=’aa’;

3 日期函数

日期函数用于处理date类型的数据,默认情况下,日期格式是dd-mon-yy 即12-12月-78

sysdate:返回系统时间

如:select sysdate from emp;

add_months(d,n):

如:查找入职8个月多的员工

select * from emp where sysdate>add_months(hiredate,8);

last_day(d):返回指定日期所在月份的最后一天

如:计算员工到公司的天数:

select sysdate-hiredate “入职天数” from emp

如:找出各月倒数第三天受雇的所有员工

select hiredate,ename from emp where last_day(hiredate)-2=hiredate;

4 转换函数

to_char 转换字符串

如:select * from emp;显示的时间往往是1980-12-17, 那么日期是否可以显示 时/分/秒

select ename,to_char(hiredate,’yyyy-mm-dd hh24:mi:ss’) from emp;

如:显示1980年入职的所有员工

select ename from emp where to_char(hiredate,’yyyy’)=1980;

to_date 用于将字符串转换成date类型

sys_context 系统函数

terminal 当前会话客户所对应的终端的标识符

language 语言

db_name 当前数据库名称

nls_date_format 当前会话客户所对应的日期格式

session_user 当前会话客户所对应的数据库用户名

current_schema 当前会话客户所对应的默认方案名

host 返回数据库所在主机的名称

如:select sys_context(‘userenv’,’db_name’) from dual; userenv 是固定的,不能改

方案与用户的关系:

Scott 用户一旦创建,oracle会自动帮用户创建一个方案,名字与Scott用户同名

方案里有很多数据对象,如表、视图、触发器、存储过程等等

数据库的管理

1 管理数据库的用户主要是sys和system,两者主要的区别有两点:

1.存储数据的重要性不同

oracle的数据字典的基表和动态视图都存放在sys用户中,sys用户拥有dba(数据库管理员),sysdba(系统管理员),sysoper(系统操作员)角色或权限

system存放次一级的内部数据,如oracle的一些特性或工具的管理信息,system用户拥有dba(数据库管理员),sysdba(系统管理员)角色或权限

2.权限的不同

sys用户必须以 as sysdba或as sysoper形式登录,不能以normal方式登录数据库

system用户如果正常登录(normal),它其实就是一个普通的dba用户,但如果以as sysdba登录,实际结果是作为sys用户登录的

sysdba、sysoper、dba的权限区别:

sysdba最高,sysoper次之,dba最低

sysdba可以创建、删除数据库 而sysoper不能创建、删除数据库

dba用户不能启动(startup )、关闭数据库(shutdown)

管理初始化参数

如:显示初始化参数

sql>show parameter

2 数据库的逻辑备份与恢复

逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程,逻辑恢复是指当数据库对象呗误操作而损坏后使用工具import利用备份

的文件把数据对象导入到数据库的过程。物理备份即可在数据库open的状态下进行也可以在关闭数据库后进行,

但是逻辑备份和恢复只能在open的状态下进行

导出

导出具体分为:导出表、导出方案、导出数据库三种

使用命令exp来完成,常见的选项有:

userid:用于指定执行导出操作的用户名、口令、连接字符

tables:用于指定执行导出操作的表

owner:用于指定执行导出操作的方案

full=y:用于指定执行导出操作的数据库

inctype:用于指定执行导出操作的增量类型

rows:用于指定执行导出操作是否要导出表中的数据

file:用于指定导出文件名

如:导出表

exp userid=scott/tiger@myoral tables=(emp) file=d:\e1.dmp //导出多个表的话就tables=(emp,dept)

如:导出其他方案的表 需要权限较高的用户

exp userid=system/maneger@myoral tables=(scott.emp) file=d:\e2.dmp

如:导出表结构

exp userid=scott/tiger@myoral tables=(emp) file=d:\e1.dmp rows=n;

如:使用直接导出方式 适合大表

exp userid=scott/tiger@myoral tables=(emp) file=d:\e1.dmp direct=y

如:导出方案

exp userid=scott/tiger@myoral owner=scott file=d:\e1.dmp

如:导出数据库

exp userid=system/manager@myoral full=y inctype=complete(增量备份) file=:\e1.dmp

导入

导入也分为:导入表、方案、数据库三种

imp常用的选项有:

userid:用于指定执行导入操作的用户名、口令、连接字符

tables:用于指定执行导入操作的表

formuser:用于指定源用户

touser:用于指定目标用户

full=y:用于指定执行导入整个文件

inctype:用于指定执行导入操作的增量类型

rows:用于指定执行导出操作是否要导入表中的数据

ignore:如果表存在,则只导入数据

如:导入表

imp userid=scott/tiger@myoral tables=(emp) file=d:\xx.dmp

假设我们换成userid=system/manager@myoral 那样是失败的,因为emp表有主外键,而system里没有外键那个表,但如果没有主外键关系,那样是可以成功的

如:导入表到其他用户

imp userid=scott/tiger@myoral tables=(emp) file=d:\xx.dmp touser=scott

如:导入表的结构

imp userid=scott/tiger@myoral tables=(emp) file=d:\xx.dmp rows=n

如:导入数据 表已存在可以只导入数据

imp userid=scott/tiger@myoral tables=(emp) file=d:\xx.dmp ignore=y

如:导入自身方案

imp userid=scott/tiger file=d:\xx.dmp

如:导入其它方案

imp userid=scott/tiger file=d:\xx.dmp fromuser=system touser=Scott

特别说明:

在导入和导出的时候,要到oracle目录的Bin目录下去导

先用cmd进入到bin目录 如:D:\program\myoracle\bin> exp userid=scott/tiger@myoral tables=(emp) file=d:\e1.dmp

3 数据字典和动态性能视图

数据字典是数据库中最重要的组成部分,它提供了数据库的一些系统信息 静态信息

动态性能视图记载了例程启动后的相关信息 动态信息

数据字典是只读表和视图的集合,只属于sys用户(即里面的基表),用户只能在数据字典上只能执行查询操作

数据字典包含:

数据字典基表:存储数据库基本信息,普通用户不能直接访问数据字典的基表

数据字典视图:基于数据字典基表所建立的视图,普通用户可以查询来获得系统信息,主要包括user_xxx,all_xxx,dba_xxx三种类型

user_tables:用于显示当前用户所拥有的所有表,它只返回用户对应方案的所有表

如:select table_name from user_tables;

all_tables:用户可以访问到的所有表

如:select table_name from all_tables;

dba_tables:会显示所有方案所拥有的数据库表,但需要dba角色

在建立用户时,oracle会把信息存放到数据字典中

dba_users:显示所有数据库用户的详细信息 select username from dba_users

dba_sys_privs:显示用户所具有的系统权限

dba_tab_privs:显示用户具有的对象权限

dba_col_privs:显示用户具有的列权限

dba_role_privs:显示用户所具有的角色

如何查询Scott用户具有的角色?

可以先sql>desc dba_role_privs来看一些字段信息

然后sql>select * from dba_role_privs where grantee=’SCOTT’;

如何查询一个角色包含多少个权限?

a.一个角色包含的系统权限

select * from dba_sys_privs where grantee=’CONNECT’;

另外也可这样查看:

select * from role_sys_privs where grantee=’CONNECT’;

b.一个角色包含的对象权限

select * from dba_tab_privs where grantee=’CONNECT’;

如何查看oracle中有多少个角色?

sql>select * from dba_roles

显示当前数据库的全称

select * from global_name;

4 管理表空间和数据文件

表空间是数据库的逻辑组成部分,从物理上讲,数据库数据存放在数据文件中;从逻辑上讲,

数据库则是存放在表空间中,表空间由一个或多个数据文件组成。

oracle逻辑结构:表空间、段、区、块 (一级比一级大)

表空间的作用:

1.控制数据库占用的磁盘空间;

2.dba可以将不同数据类型部署到不同的位置,有利于i/o性能,同时利于备份和恢复管理操作

a.建立表空间

create tablespace data01 datafile ‘d\test\data01.dbf’ size 20m uniform size 128k;

会创建名为data01的表空间,区的大小为128k

b.使表空间脱机

alter tablespace 表空间名 offline;

c.使表空间只读

alter tablespace 表空间名 read only;

d.知道表空间名,显示表空间包括的所有表

select * from all_tables where tablespace_name=’表空间名’;

e.知道表名,想查看属于哪个表空间

select tablespace_name,table_name from user_tables where table_name=’emp’;

f.删除表空间

drop tablespace 表空间名 including contents and datafiles;

including contents 表示删除表空间时,删除该空间的所有数据库对象,而datafiles表示将数据库文件也删除

g.扩展表空间,有三种方法

增加数据文件

alter tablespace sp01 add datafile ‘d:\test\sp02.dbf’ size 20m;

增加数据文件的大小

alter tablespace sp01 datafile ‘d:\test\sp01.dbf’ resize 20m; 单个文件不能超过500m

设置文件的自动增长

alter tablespace sp01 datafile ‘d:\test\sp01.dbf’ autoextend on next 10m maxsize 500m;

移动数据文件

有时磁盘部分损坏了,数据文件不能使用了,为了能够重新使用那些好的数据文件,需要将文件的副本移动到其它磁盘,然后恢复

案例:移动数据文件sp01.dbf

1.确定数据文件所在的表空间

select tablespace_name from dba_data_file where file_name=’d:\test\sp01.dbf’;

2.使表空间脱机

alter tablespace 表空间名 offline;

3.使用命令移动数据文件到指定的目标位置

host move d:\test\sp01.dbf c:\test\sp01.dbf;

4.在物理上移动数据后,还必须执行alter tablespace命令对数据库文件进行逻辑修改

alter tablespace sp01 rename datafile ‘d:\test\sp01.dbf’ to ‘c:\test\sp01.dbf’;

5.使表空间联机

alter tablespace 表空间名 online;

约束

约束包括:

not null:必须插入数据

unique:不能重复,但能为空,一张表可以有多个unique

primary key:不能重复,而且不能为空,一张表只能有一个主键

foreign key:定义主表跟从表的关系

check:强制数据必须满足的条件

案例:商店的设计

商品表goods (商品号 goodid,商品名 goodname,单价 unitprice,商品类别 category,供应商 provider)

客户表customer(客户号 customerID,姓名 name,住址 address,电邮 Email,性别 sex,身份证 cardID)

购买表purchase(客户号customerID,商品号goodsid,购买数量nums)

要求:

客户姓名不能为空;

单价必须大于1,且购买数量必须在1到30之间;

电邮不能重复;

客户的性别必须是男或者女,默认是男;

create table goods (goodsid char(8) primary key, //自动会取个主键约束名字

goodname varchar2(30),

unitprice number(10,2) check (unitprice>0),

category varchar2(20),

provider varchar2(20));

create table customer (custmoerid char(8) primary key,

name varchar2(30) not null,

address varchar2(30) ,

emailvarchar2(20) unique,

sex char(2) default ‘男’ check (sex in (‘男’,’女’)),

cardID char(18));

create table purchase (customerID char(8) references customer(custmoerid),

goodsid char(8) references goods(goodsid),

nums number(5) check(nums between 1 and 30);

如果在建完表后,发现需要增加其它约束,那么可以使用alter table 命令增加表约束,但要注意 增加not null 约束时,需要使用modify选项,而增加其它约束则用add选项

如:增加商品名也不能为空

alter table goods modify goodname not null;

如:增加身份证不能重复

alter table customer add constraint aa1//约束名字 unique(cardID);

如:增加客户地址只能在海淀、朝阳、东城

alter table customer add constraint aa2 check(address in (‘海淀’,’朝阳’,’东城’));

删除约束

alter table 表名 drop constraint 约束名称;

特别说明:在删除主键约束的时候,可能会有错误

alter table 表名 drop primary key;

这是因为如果两张表存在主从关系,那么在删除主表的主键越是时,必须带上cascade选项

alter table 表名 drop primary key cascade;

列级定义:在定义列的同时定义约束

create table department(dept_id number(2) constraint pk_department primary key,

name varchar2(12));

表级定义:定义完所有列后,再定义约束 ,这里需要注意 not null只能在列级上定义

create table employee(emp_id number(4),name varchar2(15),dept_id number(2),

constraint pk_employee primary key,

constraint fk_employee forengn key (dept_id) references department(dept_id));

索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低i/o次数,从而提高数据访问性能

为什么添加索引后,能增加查询速度呢?

如果字段不经常查询,那最好不要建立索引,因为索引需要维护,需要资源建立

单列索引:基于单个列所建立的索引

create index 索引名 on 表名(列名);

复合索引:基于两列或是多列的索引

create index 索引名 on 表名(列名,列名); //两个列名一样但顺序不一样也是两个不同的索引,应该把容易区分数据的列名放后面,因为sql从后往前扫描

使用原则:

1.在大表上建立索引;

2.在where或是连接条件上经常引用的列上建立索引

3.索引的层次不要超过4层

索引缺点分析:

1.建立索引,系统要占用约为表的1.2倍的硬盘和内存空间来保护索引

2.更新数据的时候,系统必须要有额外的时间同时对索引进行更新以维持数据和索引的一致性

B*树索引建立在重复值很少的列上,而位图索引则建立在重复值很多,不同值相对固定的列上

显示表的所有索引

select index_name,index_type from user_indexes where table_name=’表名’;

显示索引列

select table_name,column_name from user_ind_columns where index_name=’索引名’;

管理权限和角色

常见的系统权限 不级联回收

create session 连接数据库

create table 建表

create view 建视图

create public synonym 建同义词

create procedure 建过程、函数、包

create trigger 建立触发器

create cluster 建簇

常见的对象权限 级联回收

alter 修改

delete 删除

select 查询

insert 添加

update 修改

index 索引

reference 引用

execute 执行

角色

预定义角色

connect

resource

dba 没有启动和关闭数据库的权限

自定义角色

建立角色 不需要验证

create role 角色名 not identified

建立角色 需要验证

create role 角色名 identified by lou

对角色授予权限

grant insert,update,delete on scott.emp to 角色名

分配角色

grant 角色名 to blake (with admin option)

删除角色

drop role 角色名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: