oracle数据库对象

本文详细介绍了Oracle数据库中的行级锁机制,包括其概念、应用及释放,并通过实例展示了如何使用`SELECT ... FOR UPDATE`进行数据锁定和检测。此外,还探讨了数据库对象如序列、同义词和视图的创建与使用。对于性能优化,讲解了索引的重要性,以及如何创建和删除索引。最后,通过实例展示了视图在权限管理和数据隔离方面的应用。
摘要由CSDN通过智能技术生成

--二、锁  含义:
--1、概念
--1)用于控制共享资源并发访问的机制
--2)可以保护正在被修改的资源,保证数据的一致

--2、行级锁
--1)Oracle自动为 select * from emp for update wait 10;
-- 应用行级锁,锁定当前正在操作的数据
-- 在使用insert,delete,update,select…for update语句时,Oracle会自动应用行级锁
--2)释放锁:提交 commit 或 回滚 rollback

select * from scott.emp;
--行级锁演示
--1.scott用户下删除7369数据
delete from scott.emp where empno = 7369;
--2.sys用户下修改7369数据
update scott.emp set sal=sal+100 where empno=7369;

--3、select...for update 的作用:
--1)用于锁定查询结果集
--for update;
select * from scott.emp for update;
--2)用于检测数据是否被锁定,以及限定用户等待的时间 
--sys用户操作数据update,delete
--scott用户执行如下语句
--for update nowait; 不等待
--for update wait 10; 等待10秒
select * from emp for update nowait;--不等待
select * from emp for update wait 10;--等待10秒

--select ... for update 锁演示
--1.scott用户下查询for update
select * from emp for update;
--2.sys用户下修改emp数据
update scott.emp set ename ='张三' where empno =7369;


select * from dept
--ACCOUNTING
--SMITH
--阻塞
--1.sys用户更新emp表,scott用户更新dept表
update scott.emp set ename='AAA' where empno=7369;
update dept set dname='CCC' where deptno=10;
--2.soctt用户更新emp表
update emp set ename='BBB' where empno=7369;

--死锁 
--Oracle数据库会自动检测死锁,并且会通过终止两个事物来解决其中一个
--3.sys用户继续更新emp表
update scott.emp set ename='DDD' where empno=7369;


--三、数据库对象(逻辑组件)
--1、表 table:最基本的对象
--创建一个test表,字段id,name

--2、序列 sequence:用于生成连续的、唯一的序号
--1)创建简单序列:初值=1,增量=1
--create sequence 序列名;
--删除序列
--drop sequence 序列名;
create sequence SEQ_NO;

select SEQ_NO.NEXTVAL from dual;
select SEQ_NO.CURRVAL from dual;

insert into hrit values(SEQ_HRIT.NEXTVAL,'john');

select * from hrit;

--2) 使用序列
--序列名称.nextval 下一个值
--序列名称.currval 当前值
select seq_xxx.currval from dual;
--批量查询序列 
--select 序列名.nextval from 表名;
select seq_xxx.nextval from emp;
--2)创建复杂序列
--创建序列
--create sequence 序列名
create sequence seq_aaa  
--初始值
--start with 数值
start with 1
--增量
--increment by 数值
increment by 1
--最大值
--maxvalue 数值
maxvalue 1000
--最小值
--minvalue 数值
minvalue 1
--循环
--cycle
cycle
  
-- 接收用户输入一个姓名  用&符号 
-- '&提示'
--3)应用:结合表生成自动增长列
-- 在test中插入数据,使用序列作为id , 用户输入作为用户名 '&用户名'
insert into test values(99999999,'&请输入用户名');

insert into hrit values(SEQ_HRIT.NEXTVAL,'&请输入');

--同义词 :
--公用Oracle同义词 -- 所有用户可以查看
--私有Oracle同义词 -- 创建者可以查看

--从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系
--作用:不同的用户,可以通过访问同义词获取其它用户中保存的表
--1.创建同义词
-- create [public] synonym 同义词名 for 用户.表名;
create public synonym sy_emp for scott.emp;
--2.根据同义词查询表
--select * from 同义词名
select * from sy_emp;
--3.删除同义词,不会删除表
--drop public synonym 同义词名
drop public synonym sy_emp;

--4.查看所有同义词 dba_synonyms
--select * from dba_synonyms;
select * from dba_synonyms; 

--3、视图 view:用于从不同角度向用户展示数据
--1)视图是虚拟表,是对表中数据的引用
--2)可以对视图进行增删改操作,且成功的操作会影响基表的数据
--3)实际开发中,一般只对视图作查询
--4)优点:简化SQL语句,隐藏敏感数据


--scott用户无创建视图权限,需要授权
--any view任何视图
--grant create any view to scott;
--创建简单视图
--create [or replace] view 视图名称
--as 查询结果集
--select * from 表名 
   
--查询视图(类似于查询表)

--删除视图(不会影响表)

--视图的用处,同一张表可以拆分成多个部分,给相对应的人群观看
--emp表演示
--1.普通员工只能查看姓名和职位
create view v_emp
as
select ename,job from emp;

select * from v_emp;

--2.人力资源部能查看姓名,职位和基本工资,奖金
create view v_emp_hr
as
select ename,job,sal,comm from emp;

select * from v_emp_hr;

drop view v_emp;

--3.总经理可以查看所有的
create view v_emp_pres
as
select empno,ename,job,mgr,hiredate,sal,comm,dname,loc from emp e left join dept d on e.deptno=d.deptno;

select * from v_emp_pres
--多表联查可以简化成视图查看

--4、索引 index:用于优化查询,提高程序性能
--1)理解
--  新华字典
--  目录页:存储汉字的页码
--  汉字页:存储汉字的详细信息

--  数据库
--  索引页:存储数据的地址(索引)
--  数据页:存储数据的详细信息
  
--2)创建合适的索引:
--a-数据量大
--b-一般给经常用于where条件、分组、排序的字段创建索引

create table test(
 id number,
 name varchar2(50)
)

select * from test where name='JACK4000000';
--3)Oracle索引分类:
--a-标准索引
--create index 索引名 on 表名(列名);
create index ix_name on test(name);

--b-唯一索引,主键、唯一键自动应用唯一索引
--  create unique index 索引名 on 表名(列名);

--c-组合索引,用于多条件的组合查询 
--  create index 索引名 on 表名(列名1,列名2...);
  create index ix_name on test(name,age);
  
--4)删除索引
--drop index 索引名;
--插入5000W条数据

create sequence seq_test;

truncate table test;

declare 
       nums number:=1;
begin
  loop
  insert into test values(seq_test.nextval,'JACK'||nums);
  nums:=nums+1;
  if nums=50000000 then
    exit;
  end if;
  end loop;
end;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值