Oracle 学习笔记
前言
本贴内容纪录Oracle课程中的学习笔记,和Oracle的课后作业,以及数据库相关课程的学习笔记,笔记部分使用实例代码记录,不记详细语法。
用户管理
1.如果新安装数据库后,忘了oracle用户的密码,可以用哪些方法重新设置密码?(从系统用户sys和普通用户scoot两个方面去考虑),针对两种不同类型的用户,给出解决问题的具体思路和代码。
分两种情况考虑:
一种是忘记普通用户(如scoot)
用SYS (或SYSTEM)用户登录: CONN SYS/PASS_WORD AS SYSDBA;
使用修改语句:ALTER USER user_name IDENTIFIED BY newpass;
注意:密码不能纯数字或以数字开头,否则会出现ORA-00988: 口令缺失或无效
另一种是管理员用户(SYS或System)
可以使用ORAPWD.EXE 工具修改密码。
开始菜单->运行->输入CMD
,打开命令提示符窗口,输入如下命令:
orapwd file=D:oracleproduct10.2.0db_1databasepwdctcsys.ora password=Wut1234
或者使用系统模式登陆
cmd中输入 sqlplus /nolog
使用系统登入
conn / as sysdba;
输入
alter user sys identified by Wut1234;
用户以及权限管理
创建用户
CREATE USER user1 IDENTIFIED BY user1;
授权 WITH ADMIN OPTION 传递
GRANT CREATE SESSION,CREATE TABLE TO user1 WITH ADMIN OPTION;
收回授权
REVOKE CREATE SESSION,CREATE TABLE FROM user1;
将scott模式下的emp表的SELECT,UPDATE,INSERT权限授予user1用户(带 WITH GRANT OPTION 参数)。
CONN scott/tiger
GRANT SELECT,INSERT,DELETE ON emp TO user1 WITH GRANT OPTION;
回收用户user1授予的scott模式下的emp表的SELECT,UPDATE,INSERT权限。
CONN scott/tiger@orcl
REVOKE SELECT,UPDATE,INSERT ON emp FROM user1;
表空间
建表空间
CREATE TABLESPACE datastudent
DATAFILE '%ORACLE_HOME%databasedatastudent.dbf'
SIZE 100M REUSE
UNIFORM SIZE 128K;
建临时表空间
CREATE TEMPORARY TABLESPACE tempstudent
TEMPFILE '%ORACLE_HOME%databasetempstudent.dbf'
SIZE 120M REUSE
UNIFORM SIZE 128K;
建用户并指定表空间
CREATE USER class_mgr IDENTIFIED BY manager DEFAULT TABLESPACE datastudent TEMPORARY TABLESPACE tempstudent;
授权用户指定权限
GRANT SELECT ON scott.emp TO class_mgr;
GRANT UPDATE(deptno,dname) ON scott.dept to class_mgr;
手动修改表空间大小
ALTER TABLESPACE data_ts1
ADD DATAFILE
'%ORACLE_HOME%databasedata_ts2.dbf' SIZE|RESIZE 10M; //增加/减少
开启/关闭自动扩容
ALTER DATABASE DATAFILE
'%ORACLE_HOME%databasedata_ts2.dbf'
AUTOEXTEND ON|OFF NEXT 5M MAXSIZE 100M; //开关
删除表空间-删除临时
ALTER TABLESPACE temp_ts1
DROP TEMPFILE
'%ORACLE_HOME%databasetemp_ts2.dbf';
删除表空间-删除数据文件及约束
DROP TABLESPACE temp_ts1
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;
表空间离线/上线
ALTER TABLESPACE tablespace_name ONLINE|OFFLINE
离线状态的表空间是不能进行数据访问的,所对应的所有数据文件也都处于脱机状态。
表空间读写状态
ALTER TABLESPACE tbs_name
READ ONLY|READ WRITE //可读 读写
Oracle数据类型
常用数据类型:
- VARCHAR2:可变长字符串类型,≤4KB
- DATE :固定长度(7B)的日期型。注意存储与使用格式
- TIMESTAMP:时间戳类型,可更精确的存储与表示时间
- NUMBER:数字型,可存放实型和整型
- FLOAT:浮点型,可存放实型
不常用数据类型:
- BLOB 大二进制对象类型,≤4GB
- CLOB 大字符串对象类型,≤4GB
- NCLOB:多字节字符集的CLOB,≤4GB
- BFILE:外部二进制文件类型,只读,大小与OS有关
- ROWID:存储记录行的物理地址(2进制表示),固定为10个字节
特殊类型Date(注意)
用来存放日期时间类型数据,用7个字节分别描述年、月、日、时、分、秒。 语法格式:
date_field DATE;
缺省格式为DD-MON-YY,分别对应日、月、年。
例17-JUN-02。(月份的表达要用英文单词的缩写格式)。
日期的格式可以设置为中文格式,例如17-六月-2002。
to_date('2017-03-02','yyyy-mm-dd')
SQL> select to_date('2017-03-02','yyyy-mm-dd') from dual;
Oracle衍生Date类型-TIMESTAMP 不展开赘述
表管理
表是真正存储各种各样数据的对象,由行和列组成。行有时也称为记录,列有时也称为字段或域。设计数据库时,要决定它包括哪些表,每个表中包含哪些列,每列的数据类型等。
在表中创建列时,必须为其指定数据类型,列的数据类型决定了数据的取值、范围和存储格式。
建表
Create Table XS
(XH VARCHAR2 (10) NOT NULL,
XM VARCHAR2 (20) NOT NULL,
ZYM VARCHAR2 (20),
XB VARCHAR2(2) NOT NULL,
CSSJ Date NOT NULL,
ZXF Number(2) DEFAULT 01,
BZ Varchar(200)
);
使用查询建表
为了保存原始数据以便于恢复或是得到一个与源表一样结构的表,可通过子查询创建表。
CREATE TABLE XS_JSJ
AS SELECT * FROM XS WHERE ZYM='计算机' ;
例为计算机专业的学生创建一个备份表XS_JSJ。
表管理
主要为对列及其属性的修改
增加列
ALTER TABLE XS ADD
( JXJ NUMBER(1),
DJSM VARCHAR2(40) DEFAULT '奖金1000元'
);
修改列
ALTER TABLE XS
MODIFY ( DJSM DEFAULT '奖金800元' );
删除列
ALTER TABLE XS
DROP COLUMN DJSM;
修改表名
Alter Table XS Rename To XSCopy;
或
Alter Table XS
RENAME XS TO XSCopy;
修改字段名
Alter Table xscopy
Rename Column BZ To BZSM;
删除表
DROP TABLE XS;
表的删除闪回
FLASHBACK TABLE XS TO BEFORE DROP;
注意:管理员sys是没有回收站,请尽量不要在sys用户下创建表
语法:FLASHBACK TABLE 表名TO BEFORE DROP;
此命令可用于恢复误删除的表、视图和索引。
彻底删除表
无法闪回
DROP TABLE XS PURGE;
临时表
临时表的特点:
- 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的临时表,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;
- 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。
会话级临时表
会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断(truncate table,即数据清空)了。会话级的临时表创建方法:
Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Preserve Rows;
事务级临时表
事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:
Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Delete Rows;
两中类型临时表的区别
会话级临时表采用on commit preserve rows;而事务级则采用on commit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commit、rollback或者是会话结束,临时表中的数据都将被截断
约束
主键约束,外键约束,特殊约束等
手机号约束
ALTER TABLE EMPLOYEES
ADD ( CONSTRAINT "CH_PHONE_CHECK" CHECK (phonenumber between '000000000000' and '999999999999') ) ;
索引
在Oracle 中,索引是为了加速对表中元组的检索而创建的一种分散存储结构; 索引是对表而建立的,由除存放表的数据页面以外的索引页面组成,独立于被索引的表。
注意:索引增加了查询的速度,但是会降低插入,修改,删除的速度,故县插入数据,后创建索引。
- 索引中存储了记录的关键字和ROWID
- 索引在逻辑上和物理上都与相关表的数据无关
- 索引需要单独的存储空间。否则使用表所在表空间
- 创建或删除一个索引不会影响基于数据表的数据库应用或其他索引
- 创建索引后一般会增加数据更新操作的执行时间
B-树索引(B-tree index)
B*树索引存储结构类似书的索引结构,有分支和叶两种类型的存储数据块(叶子块数据是排序的,从左向右递增; 在分支块和根块中放的是索引的范围 ),分支块相当于书的大目录,叶块相当于索引到的具体的书页。
对于取值范围很大的列应当创建B树索引。
位图索引
位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应。( 每一个BIT(值是1或0)对应着一个ROWID。是1表示着BIT对应的ROWID有值;)
对于取值范围很小的列应当创建位图索引。
条件
- 索引的表或簇必须在自己的模式中;
- 必须在要索引的表上具有INDEX权限;
- 必须具有CREATE ANY INDEX权限。
创建索引
CONN scott/tiger@orcl
CREATE INDEX kc_kcm_index
ON kc(kcm DESC)
TABLESPACE my_index;
默认情况下,索引中数据按升序(ASC)排列
视图
视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候, 只是重新执行SQL.
视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
需要给予视图权限
-- 给予创建视图权限
conn system
GRANT create view TO McswAdmin;
创建视图
create or replace view vw_Users_Buy
as
select "Users_Id","Goods_Id","Tr_Num"
from Transaction_Log
order by "Tr_Id";
PL/SQL程序块
PL/SQL程序块是PL/SQL程序的基本单元,按照指定的方式,进行定义的一段程序。
概念等内容参考 PL/Sql语句块
示例:
--序列
create sequence Users_sequence
increment by 1
start with 10000020
nomaxvalue
nocycle
nocache
--触发器
CREATE TRIGGER Users_idadd
BEFORE INSERT ON Users
FOR EACH ROW
WHEN(NEW."Users_Id" is null) --当输入ID为空时启动触发器
BEGIN
select Users_sequence.nextval into :new."Users_Id" from sys.dual;
END;
--创建good_check函数,检查商品的对应游戏物品ID
CREATE OR REPLACE FUNCTION good_check
(f_goodsid Goods."Goods_Id"%type
)
RETURN Goods."Goods_Game_id"%TYPE
AS
v_g_rname Goods."Goods_Game_id"%TYPE;
BEGIN
select "Goods_Game_id" into v_g_rname FROM Goods
where "Goods_Id"=f_goodsid;
RETURN v_g_rname ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到对应游戏物品!');
END good_check;
--调用good_check输入Goods_Id和Goods_Game_id检查商品的对应游戏物品ID
select good_check('ces01') from dual;
- 代码重写WordPress网页标题为“原网页标题|网站名”的形式
- 未来10年21个核心工作岗位
- Asp.net 2.0 WebPart使用经验点滴
- 使用LinqToExcel读取Excel
- 时代的需要:越来越多的Java工程师开始转向hadoop?
- 如何结合IbatisNet的LIST遍历实现模糊查询
- Flash/Flex学习笔记(41):碰撞检测
- [.NET网格计算框架] Alchemi
- 修改WordPress登陆文件名wp-login.php,防密码被暴力破解
- NDoc - .NET 代码文档生成器
- Mono P/Invoke :DLLImport
- MONO x64 amd_x64
- DN榜:最近3个域名成交金额均达到六位数美金
- 采访Philipp Crocoll:安卓平台上整合Java和C#
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Firefox 如何对发送的参数进行调试
- ios摄像头推流(1)
- leetcode之最短补全词
- React基础(10)-React中编写样式CSS(styled-components)
- 十大经典排序算法 (动态演示 + 代码)
- 学生成绩管理系统案例
- C 语言指针详解
- 04 CentOS6.5系统语言切换为中文
- 【SpringBoot DB 系列】Redis 高级特性之 Bitmap 使用姿势及应用场景介绍
- 踩坑:一次年轻代GC长暂停问题的解决与思考
- 监听MySQL的binlog日志工具分析:Canal
- 小解c# foreach原理
- 3分钟短文:任命管理员,给Laravel普通用户提权
- this到底是什么?
- ES5面向对象基础