Oracle学习笔记——Oracle高级

1.视图:

视图实际上是一条查询语句,是数据的显示方式,是数据库中的虚表。

视图的作用:安全,方便,一致性。
(1).
创建视图:

create [or replace] view 视图名

as

SQL查询语句……

为确保视图选项一致性,加上“with check option”。

(2).视图的约束:

a.当组成视图的表是两个或两个以上时,不能通过视图对两个或两个以上的基表做插入、更新等操作。视图多表的更新问题需使用触发器。

b.当创建视图时,加上“with read only”,则视图只读。

c.当视图中含有group byavgsum等聚合函数以及distinct时,视图也是只读的。

2.同义词:

同义词相当于别名,利用同义词可以很方便地操纵不同用户模式下的对象。

如:create synonym emp for scott.emp;

soctt用户的emp表赋予一个emp的同义词,当需要操纵scott.emp表时,直接使用同义词即可。默认同义词是私有的。

创建公共同义词,如:create public synonym dept for scott.dept;

3.序列:

对于Oracle数据库中自增的字段,通过使用序列Sequence来维护。

(1).创建序列:

create sequence mySeq

start with 1                          --起始值为1

increment by 1                            --每次增加1

order

nocycle                               --不循环

(2).在表中具体应用序列:

如表:auto(a number, b varchar2(10));

Insert into auto(mySeq.nextval, ‘aa’);

(3).更改序列

alter sequence 序列名

……

注意:只能修改递增量,不能修改当前值。

4.触发器:

数据库中在某种情况触发下执行的PL/SQL语句块。触发器分为行级和语句级,行级触发器每一条记录触发一次,语句级每次触发只执行一次。

创建简单创建触发器:

create or replace trigger mytrigger

after delete on dept

for each row                                                    --行级触发器

begin

delete from emp where deptno = :old.deptno;

end;

/

其中:oldneworacle数据库中的内存逻辑表,和SQL Server中的inserteddeleted类似。其具体对应关系如下:

old                 new

insert操作             no                  yes

delete操作            yes                no

update操作           yes                yes

注意:在触发器中,不能写commitrollback等事务控制语句。

5.利用触发器实现表字段自增方法:

使用3中创建的序列mySeq

create or replace trigger set_no

before insert on emp

for each row

declare

sn number;

begin

select mySeq.nextval into sn from dual;

:new.empo=sn;                                   --给自增字段赋值

end;

/

6.替换触发器:

替换触发器主要是用于解决多表视图问题,创建和使用方法如下:

create or replace trigger update_view

instead of update on myView2

for each row

begin

update dept set dname = :new.dname;

update emp set ename = :new.ename;

end;

/

注意:替换触发器只能建立在视图上。

7.Oracle索引:

数据库中创建索引的目的是为了加快查询的速度,提高查询效率,但是并不是索引越多越好,因为增删记录时数据库也需要维护索引,因此需要在索引提供性能和维护索引开销进行平衡。

创建索引的语法:create index 索引名 on 表名(列名);

Oracle中一种特殊的索引——位图索引,适合于数据量大,而唯一值又很少的情况,如性别。

创建语法:create bitmap index 索引名 on 表名(列名);

8.SQL*loader导入数据:

SQL*loaderOracle中的一个程序,可以有效将大量数据装入Oracle数据库中,实现数据移植。使用时需要编写控制文件和数据文件(也可以指定)

SQL*loader的使用:

(1).要导入的数据文件:

对于规则的数据,如:

abc,def

ghi,mns

……

(2).编写控制文件:

控制文件以“ctl”为后缀

load data

infile       ‘c:/data.txt’                   --指定数据文件

append

into table test(                             --将数据添加到test表中

       m1 char terminated by “,”,    --数据以逗号(,)分隔

       m2 char terminated by ”,”

)

(3).在命令行中执行以下命令:

sqlldr 用户名/密码 control=”c:/control.ctl” data=”c:/data.txt”;  --指定控制文件和数据文件

9.Oracle数据库的备份与恢复:

(1).逻辑备份:

使用Exp进行逻辑备份导出,使用IMP进行逻辑备份导入恢复。备份文件为转储文件,以”.dmp”为后缀。具体使用方法如下:

导出:”exp 用户名/密码@数据库名       --接下来按照提示操作

导入:”imp 用户名/密码                        --接下来安装提示操作

(2).物理备份:

物理备份又分为两种:冷备份(脱机备份)、热备份(联机备份)

a.热备份准备工作:

1).热备份时将日志文件置为规定模式:alter system set log_archive=true scope=spfile

2).关掉数据库。

3).然后以monut方式重启数据库:startup mount

4).将数据切换到归档模式:

alter database archivelog;

alter database open;

b.热备份命令:

开始备份:alter tablespace 表空间名 begin backup;

结束备份:alter tablespace 表空间名 end backup;

c.热备份后切换日志文件:

alter system archive log current;

alter system switch logfile;

10.开发Oracle函数:

Oracle数据库中函数和存储过程的区别:

本质上并无区别,都是PL/SQL语句块,函数一般是用于通用处理,如数据转换等,而存储过程大多和具体特定的业务逻辑相关,两种的侧重点不同。

(1).基本语法:

create [or replace] function 函数名称(

       param1    [in | out | in out] 数据类型1

       param2    [in | out | in out] 数据类型2

       …..

)

return 返回值数据类型

is | as

PL/SQL;

注意:Oracle数据库的函数都是有返回值的,因此,函数头部必须要带有return字句,函数体内至少要包含一个return语句。

(2).开发Oracle函数的简单例子:

create or replace function get_user

return varchar2

is

declare

user_name varchar2(20);

begin

select username into user_name from User_users;

return user_name;

end;

/

注意:函数可以被PL/SQL和表达式所直接调用,SQL中调用函数只能带输入(IN)参数,SQL中调用函数不能包含insertupdatedelete语句。

11.Oracle数据库中对象重新编译:

Oracle数据库中,当修改了被引用对象的结构时,相关依赖对象就转变为无效状态,所以应重新编译。如:

alter procedure 存储过程名  compile;

alter view 视图名 compile

alter function 函数名 compile

12.Oracle中的包:

Oracle中的包用于逻辑组合相关的PL/SQL类型,PL/SQL项和PL/SQL子程序,可以实现信息隐藏,子程序重载等功能。

包由包规范和包体两部分组成:

(1).包规范:

包规范是包与应用程序之间的接口,用于定义包的公用组件,包括常量,变量,游标,函数等。

创建包规范的语法:

create [or replace] package 包名

is | as

public type and 项声明

子程序

end 包名;

(2).包体:

包体用于实现包规范所定义的过程和函数,为了实现信息隐藏,应在包体里定义私有组件。

创建包体语法:

create [or replace] package body 包名

is | as

private type and 项声明

子程序体

end 包名;

13.包的调用:

私有组件只能在包内部调用,且可以直接调用。公有组件在包内和包外均可调用,包内可以直接调用,包外调用时需要加包名。

(1).调用包公用变量:

exec 包名.变量名

(2).调用包公用子程序:

exec 包名.子程序名

(3).远程调用:

exec 包名.组件名@数据库连接名

你可能感兴趣的:(数据库)