oracle基础

oracle管理工具

工具一:
SQL*PLUS工具
命令提示符对话框
工具二:
SQL Developer工具
oracle提供的免费的图形化工具,
工具三:
OEM(企业管理器)
Oracle Enterprise Manager(OEM),基于web界面的Oracle管理工具(类似于ElastricSearch这些web界面)

注意:
SQL Developer工具,可以执行sql、pl/sql
SQLPLUS工具,可以执行sql、pl/sql语句 、SQL PLUS命令(只能在SQLPLUS工具中使用)
sql(如,select\insert\update等)
pl/sql(一种过程话语言,sql语句的基础上加入了流程控制等功能,如if条件语句,loop循环语句,可控制流程)
SQL PLUS命令:
SQPPLUS工具可以执行两种命令,分别为
1、本地命令(即SQP PLUS命令,这是SQL
PLUS工具自定义的命令,如set命令,help命令,describe命令)
2、服务器执行的命令(除了SQP PLUS命令以外的命令,如create table ,insert等命令)
本地命令一般在本地执行,不发给服务器,而服务器命令则需要服务器处理)

数据字典

前缀:
dba_:包含数据库实例的所有对象信息
V$:当前实例的动态视图,包含系统管理和系统优化等使用的视图
user
:用户的对象信息
gv_:分布式环境下,所有实例的动态视图,包含系统管理和系统优化等使用的视图
all_:记录用户的对象信息以及被授权访问的对象信息

常用基本数据字典

dba_tablespace 表空间信息
dba_free_space 表空间中自由分区
dba_tables 数据库中所有数据表的信息
dba_tab_columns 所有表、视图、簇的列
dba_views 数据库中所有视图信息
dba_indexs 数据库中所有索引描述
dba_triggers 数据库中所有触发器描述
dba_object 数据库中所有对象
dba_users 数据库中所有用户信息
v s e s s i o n 有 关 会 话 的 信 息 v session 有关会话的信息 v sessionvprocess 当前进程信息
v$bgprocess 后台进程信息

函数

常用函数

ascii(字符) 返回于字符相对于的ascii码值(十进制)
chr(数字) ascii(字符)函数的反向作用,给出数字,返回字符
concat(列1/字符串1,列2/字符串2) 拼接
initcap(列/字符串) 首字母大写,其余小写
length(列/字符串) 长度
lower(列/字符串) 全部字符串转小写
upper(列/字符串) 全部字符串转大写
replace(列/字符串1,字符串) 用字符串2替换字符串1
substr(列/字符串,开始点I,[长度j]) 截取

数字类函数

abs(n) n的绝对值
ceil(n) 返回大于等于n的最小整数
exp(n) e的n次幂,e=2.71828183
floor(n) 返回小于等于n的最小郑虎
log(n1,n2) 以n1为 底n2的对数
mod(n1,n2) 取模,n1除以n2的余数
power(n1,n2) n1的n2次方
sign(n) 若n为负数,则取-1
若n为正数,则取1
若n为0,则取0
cos(n) 余弦值(n为弧度)
sin(n) 正弦值(n为弧度)
sqrt(n) n的平方根(n非负数)
round(n[,保留位数]) 对n进行四舍五入,可以指定保留位数,若不知道保留位数,则小数点后全部被四舍五入
trunc(n[,截取位数]) 保留指定位数的小数,若不指定,则不保留小数

日期类函数

add_months(d,i) 返回日期d加上i月之后法人结果
last_day(d) 返回d月份最后一天
months_betweem(d1,d2) 返回的d1和d2之间的月份数
sysdate() 系统时间

转换类函数

to_char(x[,format]) 转换成字符串
to_date(x,[format]) 转换成日期
to_number(x[,format]) 转换成数字

聚合类函数

avg(x) 平均值
count(x) 计数
max(x) 最大值
min(x) 最小值
sum(x) 和
varlance(x) 统计方差
stddev(x) 标准方差

PL/SQL编程

PL/SQL简介:

PL/SQL(Procedual Language/SQL)是一种过程化语言,可以在pl/sql中添加if/loop语句实现对程序流程的控制,甚至可以定义变量,以便在语句之间传递数据信息

pl/sql块数据:

pl/sql程序是以块(block)为基本单位的,整个pl/sql块分为三部分:
申明部分:declare(可选存在)
执行部分:begin(必须存在)
异常处理部分:exception(可选存在)
语法:
[declare]
begin
[exception]
end;
/
注意:
“end”:表示结束程序
“;”表示结束块程序
“/”表示执行块程序
(1)申明部分(declare):包含变量定义,用户定义的pl/sql类型、游标、引用的函数或过程。
(2)执行部分(begin):包含变量赋值,对象初始化、条件结构、循环结构、嵌套的pl/sql匿名块、对局部或pl/sql命名块的调用
(3)异常部分(exception)包含错误处理语

申明变量和赋值

Oracle定义变量的四种方式
1、 定义一般变量
语法:变量名称[constant]类型[not null][:=value]
说明:contant用来申明常量,常量在申明时必须为其赋值
举例:declare
numA number not null :=150;–申明变量numA并为其赋值150
numb number;–申明变量numB
numC constant number :=150;–申明常量numC并为其赋值150
2、 使用%type申明变量类型
当希望申明的变量具有和数据表中的某一列的数据类型相同,则可以采用%type来定义。
语法:变量名称 表名称.字段名称%type
举例:declare
eno emp.empno%type;
rna emp.ename%type;
3、 使用record申明变量类型
语法:type record_type is record
{
var_number1 data_type [not null] [:=default t_value],
……
var_numberN data_type [not null] [:=default t_value]
}
举例:declare
type emp_type is record
{
var_ename varchar2(20),
var_job varchar2(20),
var_sal number
}
说明:
该类型的变量可以存储由多个列值组成的一行数据。
4、 使用%rowtype申明变量类型
语法:rowVar_name table_name%rowtype
说明:%rowtype类型的变量结合了”%type类型”和”记录类型”变量的优点,可以存储表中一行数据记录
举例:declare
rowVar_emp emp%rowtype;
注意:oralce所有申明变量均在declare部分进行

流程控制语句

if…then
if…then…else
if…then…elseif
case
loop…exit…end
loop…exit when…end
while…loop…end
for…in…loop…end
godo
(1)、if语句
举例:
set serveroutput on
declare
month int;
begin
month :=&inputmonth;
if month >= 1 and month<=3 then
dbms_output.put_line(“这是春季”);
if month >=4 and month <=6 then
dbms_output.put_line(“这是夏季”);
if month >=7 and month <=9 then
dbms_output.put_line(“这是秋季”);
if month >=10 and month <=12 then
dbms_output.put_line(“这是冬季”);
else
dbms_output.put_line(“对不起,月份不合法”);
end if;
end;
/
(2)、case语句
语法:
case <变量>
when <表达式1> then
语句块1
when <表达式2> then
语句块2
……
when <表达式n> then
语句块n
else
条件都不满足时执行的语句块;
end else;
举例:
set serveroutput on
declare
session int :=&inputsession;
aboutInfo varchar2(50);
begin
case season
when 1 then
aboutInfo := season||’季度包括1,2,3份’;
when 2 then
aboutInfo := season||’季度包括4,5,6份’;
when 3 then
aboutInfo := season||’季度包括7,8,9份’;
when 4 then
aboutInfo := season||’季度包括10,11,12份’;
else
aboutInfo :=season||’季度不合法’;
end case;
dbms_output.put_line(aboutInfo);
end;
/
(3)Loop语句
语法:
Loop
循环执行的语句块;
exit when 循环结束条件;
循环结束条件修改;
end loop;
举例:
set serveroutput on
declare
sum_i int :=0;
i int :=0;
begin
loop
i := i+1;
sum_i :=sum_i + 1;
exit when i =100
end loop;
dbm_oupput.put_line(“前100个自然数的和是”||sum_i);
end;
/
(4)while…loop语句
语法:
while(循环结束条件)loop
循环执行语句块;
循环结束条件修改;
end loop;
举例:
set serveroutput on
declare
sum_i int :=0;
i int :=0;
begin
while(i< 100) loop
i := i+1;
sum_i :=sum_i + 1;
end loop;
dbm_oupput.put_line(“前100个自然数的和是”||sum_i);
end;
/
(5)for语句
语句:
for 循环计数器 in [reverse] 循环下限值…循环上限值 loop
循环语句块;
end loop;
举例:
set serveroutput on
declare
sum_i int :=0;
i int :=0;
begin
for i in reverse 1…100 loop
if mod(i,2)=0 when
sum_i :=sum_i + 1;
end if;
end loop;
dbm_oupput.put_line(“前100个自然数中偶数的和是”||sum_i);
end;
/

游标

游标简介

在pl/sql块中,执行select、insert、updatetime和delete语句时,Oracle会在内存中为其分配上下文区(Context Area),即一下缓冲区。

游标是指向该区的一个指针,或是命名一个工作区(Work Area),或者一种结构化数据类型,它为应用程序提供了一种对于行数据查询结果集中的每一行数据进行单独处理的方法。
游标可以分为静态游标和动态游标两种
在这里插入图片描述
游标的原理:

在这里插入图片描述
游标类似于指针,当获取到查询结果集后,可以将其封装到游标变量中,游标可利用自身的属性,实现即可的访问。
静态游标的属性(隐式、显示)
%found 用户做DML操作数据时,返回true
%isopen 判断游标是否打开
%notfound 执行DML操作,没有数据返回数据行时,返回true.
%rowcount 返回更新操作的行数或者select into 返回法人行数

显示游标

(一) 声明游标
说明:声明游标时,必须指定游标名和游标所使用的select语句
语法:cursor 游标名称 ([参数列表])
[return 返回值类型]
Is 查询语句
举例:
declare
cursor cur_emp(var_job in varchar2 :=’saleman’)
is select empno ,ename ,sal from emp where job=var_job;
解释:
cur_emp:游标名
var_job:类型为varchar2的参数,注意不可以指定参数,用于存储职务(saleman为初始值)
select语句:查询结果集(本例里面,结果集是职务为saleman的结果集)
(二) 打开游标
说明:游标在声明之后,必须打开才可使用。打开游标就是执行定义的select语句。执行完毕后,查询结果装入内存,指针指向查询结果集的第一行。
语法:open 游标名([游标参数]);
举例:open cur_emp[‘manager’];
解释:
注意参数列表中的manager,这是将初始值saleman覆盖后赋的值,若此处省略manager,则查询的结果集仍然是saleman的初始值。
(三) 读取游标
说明:读取游标就是逐行将结果集中的数据保存到变量中,在游标中包含一个指向当前数据行的指针,刚打开游标时,指针指向结果集的第一行,每执行完一次fetch…into语句时,指针会自动指向下一行数据,直至结果集最后一条记录完成。
语法:fetch 游标名 into {record类型的变量}
举例:则fetch cur_emp into emp_row;
解释:则emp_row是record类型的变量
(四) 关闭游标
语法:close 游标名;
举例:close cur_emp;
例:
set serveroutput on
/声明部分开始/
declare
/声明游标,查询员工信息/
cursor cur_emp (var_job in varchar2:=’saleman’)
is select empno,ename,sal from emp where job=var_job;
/声明一个record类型的变量emp_row/
/定义record类型变量的第一步:定义record类型record_emp/
type record_emp is record
{
/定义当前记录的成员变量 var_empno,var_ename,var_sal/
var_empno emp.empno%type,
var_ename emp.ename%type,
var_sal emp.sal%type
} ;
/定义record类型变量的第二步:定义record_emp类型变量 emp_row/
emp_row record_emp;
/声明部分结束/
/执行部分开始/
begin
/打开游标/
open cur_emp(‘manager’);----给游标赋值manager
/读取游标/
fetch cur_emp into emp_row;----让指针指向结果集的第一行,并将值保存到emp_row中
/语句块/
while cur_emp%found loop
dbm_output.put_line(emp.row.var_enmae||’的编号是’||emp_row.empno||’,工资是’||emp_row.sal);
fetch cur_emp into emp_row;—让指针指向结果集的下一行,并保存到emp_row中
end loop;
/关闭游标/
close cur_emp;
end;
/

动态游标(又称游标变量)

显示游标的声明如下:
cursor cur_emp (var_job in varchar2:=’saleman’)
is select empno,ename,sal from emp where job=var_job;
其中在编译阶段,此游标的结果集是已经确定好的。
动态游标可以在运行时期,与不同的语句(select语句)进行关联,其查询语句是动态变化的,因此其处理的结果集也就是动态的
游标变量是一种引用类型,在程序运行时,可以指向不同的存储单元
注意:在使用游标变量之前,必须先声明,然后再运行时必须为其分配存储空间。
(一) 声明游标变量
语法:type 游标变量类型名称 is ref cursor [return 数据类型]
说明:游标变量类型名称:新的引用类型的名字
return 数据类型 :返回一个记录类型,它指明了最终由游标变量返回的选择列表的类型。
注意:
(1)游标变量的返回类型必须是记录类型,它可以被显示的声明为一个用户定义的记录,也可以隐式的使用%rowtype 来进行声明
(2)return语句存在与否可选择,若存在,则表示该游标变量属于强类型游标变量,若不存在,则属于弱类型游标变量。
举例:
declare
type ref_dept is ref cursor—定义游标变量类型ref_dept
return dept%rowtype; ----游标变量返回类型
cur_dept ref_dept;----定义游标变量类型为ref_dept的游标变量cur_dept
depeRow dept%rowtype;—定义行类型
(二) 打开游标变量
说明:要将一个游标变量和一个特定的select语句相关联
语法:for 游标变量 for select语句;
(三) 关闭游标变量
语法:close 游标变量;
例:
set serveroutput on
/声明部分开始/
declare
type ref_dept is ref cursor–声明一个游标变量类型ref_dept,仅仅属于一种类型,而非游标
return dept%rowtype;-- 定义游标变量返回类型
cur_rept ref_depr;–定义一个ref_dept类型的游标变量
deptRow dept%rowtype;–定义行类型
/声明部分结束/
/执行部分开始/
begin
open cur_dept for select * from dept;–打开游标变量cur_dept(注意不是ref_dept),绑定select语句
loop
fetch cur_dept into deptRow;–读取游标(即获取游标数据)
exit when cur_dept%notfound;—(当当前没有数据时退出循环,则不再读取数据)
dbm_output.put_line(‘部门编号为:’||deptRow.deptno||’,部门名称为:’||deptRow.dname||’,位于:’||deptRow.loc);
end loop;
close cur_dept;—关闭游标
end;
/

显示游标中使用for语句

语法:
for 自动的record类型的变量 in 游标名称 loop
PL/SQL语句;
end loop;
例:
set serveroutput on
declare
cursor cur_emp is
select * from emp
where deptno=30;
begin
for emp_record in cur_emp
loop
dbm_output.put(‘员工编号:’||emp_record.empno);
dbm_output.put(‘,员工名称:’||emp_record.ename);
dbm_output.put_line(‘,员工职务:’||emp_record.job);
end loop;
end;
/

隐式游标中使用for语句

例:
set serveroutput on
begin
for emp_record in (select empno,ename,job,sal from emp where job=’saleman’);
loop
dbm_output.put(‘员工编号:’||emp_record.empno);
dbm_output.put(‘,员工姓名:’||emp_record.ename);
dbm_output.put_line(‘,员工工资’||emp_record.sal);
end loop;
end;
/

存储过程、函数、触发器

没有名称的代码PL/SQL程序块,不能存储在oracle中,而想要存储PL/SQL成型块,以便日后重用(调用或引用),则需给PL/SQL命名并编译。
Oracle存储程序块的方式有4种:存储过程、函数、触发器、包

存储过程

为了重复使用部分代码块,oracle将其封装在一个特定的结构体中,这个结构体称之为存储过程。
定义:存储过程是指专门定义的一组SQL语句的集合,可以定义用户操作参数,并且存在于数据库中,使用时直接调用即可

创建存储过程

语法:
create [or replace] procedure 过程名称[(参数…)] is/as
begin
PL/SQL语句
[exception]
异常处理;
end;
/
说明:
过程名称:代表整个结构体的名称
参数:如果是输入参数,则需要在参数后面指定 in 关键字
如果是输出参数,则簇拥在参数后面指定 out 关键字
in/out后面的类型指的是参数的数据类型,这里不指定长度。
注意:
创建存储过程的语法中,其中参数是存储过程被调用或者被执行时用到的参数,而不是存储过程内定义的内部变量,内部变量要在is/as关键字后面顶底,并使用分号结束。
存储过程和PL/SQL程序块异同点:
相同:都有声明部分、执行部分、异常处理部分
不同点:1、存储过程创建时,需要使用procedure关键字,关键字后面跟着过程名和参数列表2、存储过程创建语句使用的时create or replace ,PL/SQL程序块使用的是declare
举例:
create or replace pro_insertDept is
begin
insert into dept values(77,’市场拓展部’,’jilin’);
dbms_output.put_line(‘插入新纪录成功’);
end;
/
执行这段语句,则数据库中就会存在名为pro_insertDept的存储过程
注意:仅执行创建存储过程的语句,只是将语句进行了编译,而非执行。

执行存储过程

想要执行已存储的存储程序,就需要使用execute命令来执行,或者在PL/SQL程序块中调用该存储过程。
举例:
1)使用execute命令执行:
execute pro_insertDept;
2)使用PL/SQL程序块调用:
set serveroutput on
begin
pro_insertDept;
end;
/

存储过程的参数

参数是一种想程序单元输入和输出数据的机制,存储过程可以接收多个参数。
Oracle总参数分为三类:in、out、in out
in(默认,数值传递,值传递):将数值传递进程序块,但是存储过程中对他所作的修改并不会影响原来参数的内容。给存储过程输入数值,共其使用
out(空进、带值出):不带任何数值到存储块中,但是可以在存储过程中将数值通过此变量返回给调用方,这里的参数在存储过程中被赋值,可以传递到存储过程以外的部分或环境使用。
in out(地址传递):可以将值传递到存储过程中,同时也会将存储过程中对变量的修改通过此变量返回给调用方。in out模式相当于in模式和out模式参数的集合,传入传出值都用该参数。
例:
1) in 模式参数
创建in模式参数的存储过程:
create or replace procedure insert_dept
(
num_deptno in number,
var_dname in varchar2,
var_loc in varchar2
) is
begin
insert into dept
values (num_deptno,var_dname,var_loc);
end;
/
调用in模式参数的存储过程:
exec insert_dept(77,’市场拓展部’,’吉林’);
2)out 模式参数
创建out模式参数的存储过程:
create or replace procedure select_dept
(
num_deptno in number,
var_dname out dept.dname%type,
var_loc out dept.loc%type
) is
begin
select dname,loc into var_dname,var_loc from dept where deptno=num_deptno;
exception
when no_date_found then
dbms_output.put_line(‘该部门编号不存在’);
end;
/
调用out模式参数的存储过程:
set serveroutput on
declare
var_dname dept.dname%type;
var_loc dept.loc%type;
begin
select_dept(77,dname,loc);
dbms_output.put_line(var_dname||’位于’||var_loc);
end;
/
说明:因为out模式的存储过程有out参数返回值,因此当调用或者执行这个存储过程的时候,都需要定义变量来保存这两个参数值
3)in out 模式参数
创建 in out模式参数的存储过程:
create or replace procedure pro_square
(
num in out number,
flag in boolean
) is
i int :=2
begin
if flag then
num := power(num,i);
else
num :=sqrt(num);
end if;
end;
/
调用in out模式参数的存储过程:
set serveroutput on
declare
var_number number;
var_temp number;
boo_flag Boolean;
begin
var_temp :=3;
var_number :=var_temp;
boo_flag :=false;
pro_square(var_number,boo_flag);
if boo_flag then
dbms_output.put_line(var_temp||’的平方是’||var_number);
else
dbms_output.put_line(var_temp||’的平方根是’||var_number);
end if;
end;
/
删除存储过程
语法:drop procedure count_num;
举例:drop procedure insert_dept;

函数

函数用于计算和返回一个值。函数也是一种存储在数据库内部的命名程序块,函数可以接收0到多个输入参数,并且函数必须有返回值(存储过程没有这样的要求)

创建函数

语法:
create [or replace] function 函数名(参数…) return 返回值类型 is/as
变量声明部分
begin
程序部分
[return 返回值;]
[exception]
异常处理
end [函数名];
/
说明:函数必须有返回值,因此函数主题部分(即begin部分)必须使用return语句返回函数值,并且要求返回值的类型要和函数生命部分的返回值类型一致。
举例:
create or replace function get_avg_pay(num_deptno number) return number is
num_avg_pay number;–声明变量,用于存储函数内部计算的平均值
begin
select avg(sal) into num_avg_pay from emp where deptno=num_deptno;
return(round(num_avg_pay,2));—返回平均值
exception
when no_date_found then
dbms_output.put_line(‘该部门编号不存在’);
return 0;–不满足条件时,返回0
end;
/

调用函数

因为函数必定有返回值,因此在调用函数时,必须有一个变量来保存这个函数返回值,如此,函数与这个变量就组成了一个赋值表达式。
举例:
set serveroutput on
declare
avg_pay number;
begin
avg_pay :=get_avg_pay(10);
dbms_output.put_line(‘平均工资是:’||avg_pay);
end;
/

删除函数

语法:drop function 函数名

触发器

触发器可看作为是一种特殊的存储过程。触发器通过“触发事件”来执行,能够引起触发器运行的事件即为触发事件,如:
执行DML语句(insert、update、delete、对表或者是他执行数据处理操作)
执行DDL语句(create、drop 、alter语句)
引发数据库系统事件(如系统启动、退出、产生异常错误等)
引发用户事件(如登录、退出)

创建触发器

语法:
create [or replace] trigger 触发器名
[before/after/ instead of]触发事件
on [表名/视图名/用户模式名/数据库名]
[for each row][when 触发事件]
[declare]
[变量声明;]
begin
程序代码块部分;
end [触发器名];
/
说明:
before/after/instead of:触发时机
before:触发事件操作之前触发,能防止某些错误操作便于回滚。
after:触发事件操作之后触发,便于记录该操作或某些事后处理的信息
instead of:表示此触发器为替代触发器
for each row: 指定触发器为行级触发器,当DML语句对每一行数据进行操作时,都会引起该触发器的运行,如果不指定该语句,则表示该触发器属于“创建语句级触发器”,此时数据操作无论影响了多少行,实际上触发器值执行一次。
when:触发条件
触发器分类:
根据触发器的触发事件和触发器的执行情况分类触发器:
(1)语句级触发器:无论DML影响多少行,所引起的触发器只运行一次
(2)行级触发器:对DML语句所影响的每一行操作都会引起触发器执运行
(3)替换触发器:定义在视图上的(而非表上)的触发器,用来替换所使用的实际语句的触发器
(4)用户事件触发器:指与DDL操作或用户登录、退出等事件相关的触发器
(5)系统事件触发器:在Oracle系统事件中的触发器,如系统的启动与关闭

语句级触发器

说明:语句级触发器针对一条DML语句而执行的触发器,不适应for each row子句
举例:

  1. 创建一个日志表,用于记录关于对部门表dept的各种数据操作(首次)
    create table dept_log{
    operate_tag varhcar2(10),
    operate_time date
    };
    2)创建语句级触发器
    create or replace trigger tri_dept
    before insert or update or delete
    on dept
    declare
    var_tag varchar2(10);—声明一个变量,来存储对dept表执行的操作类型
    begin
    if inserting then
    var_tag :=’插入’;
    elseif updating then
    var_tag :=’更新’;
    elseif deleting then
    var_tag :=’删除’;
    endif;
    insert into dept_log values(var_tag,sysdate);
    end tri_dept;
    /
行级触发器

说明:针对DML操作所影响的每一行数据都会执行一次触发器,必须使用for each row子句
主要用于生成主键值。
举例:
如表commodity包含主键字段id,需要为id生成不重复的有序值

  1. 创建序列
    create sequence seq_id;
  2. 创建行级触发器
    create or replace trigger tri_insert_comm
    before insert
    on commodity
    for each row
    begin
    select seq_id.nextval into :new.id–:new.id为列标识符,用来指向新行的id列,相当于当前行的id列
    from dual;
    end;
    /
替换触发器

说明:定义在视图上的触发器,一般不允许用户对视图进行DML操作,当用户为视图创建替换触发器之后,用户对视图的DML操作实际上就变成了指向触发器中的PL/SQL语句块
举例:
1) 创建视图
create view view_emp_dept as
select empno,ename,dept,deptno,dname,job
from emp,dept where emp.depeno=dept.deptno;
2)创建替换触发器
create or replace trigger tri_insert_view
insead of insert
on view_emp_dept
for each row
declare
row_dept dept%rowType;
begin
select * into row_dept from dept where deptno= :new.deptno;
if sql%notfound then
insert into dept(deptno,dname);
values(:new.deptno,:new.dname);
end if;
insert into emp (empno,ename,deptno,:new.job);
values(:new.empno,:new.ename,:new.deptno,:new.job);
end tri_insert_view;
/

删除触发器

drop trigger 触发器名;

其他数据对象

除数据表外,还有索引对象、视图对象、序列对象等

索引对象

rowid能够唯一标识数据库中某一行的具体位置。
没有索引时,要查询指定的记录,需要遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,然后根据其保存在索引中对应的rowid快速找到在表中对应的记录。
创建索引时,Oracle会自动在用户默认的表空间或者指定的表空间创建一个索引段,为索引数据提供空间。
分类:
索引数据的存储方式可以分为B树索引、位图索引、反向键索引、基于函数的索引
按照索引列的唯一性可以分为唯一索引、非唯一索引
按照索引列个数可以分为:单列索引、复合索引

创建索引

创建B树索引(默认)
create index emp _deptno_index on emp(daptno)
pctfree 25—pctfree为将来insert操作所预留的空闲空间
tablespace users;
创建位图索引
create bitmap index emp_sal_index
on emp(sal)
tablespace users;
创建反向键索引
create index emp_job_reverse
on emp(empno) reverse
tablespace users;
创建基于函数的索引
create index rmp_job_fun
on emp(lower(job));

合并和重建索引

合并:
alter index emp_deptno_index
coalesce deallocate unused;
重建:
alter index emp_deptno_index rebuild;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值