Oracle PL/SQL 编程手册,SQL大全
orderbyename;
列出有超过7个周边国家的国家名字和面积。
selectnation,area
fromnation
wherecodein
(selectnation_code
fromborder
groupbynation_code
havingcount(*)>7);
列出所有面积大于等于日本的岛国的国名和人口。
selectnation,population
fromnation,border
wherecode=nation_code(+)
andnation_codeisnull
andarea>=
(selectarea
fromnation
whereupper(nation)='JAPAN');
列出所有边界在其它国家中的国名,并且显示其边界国家名字。
breakonnation
selectnation1.nation,
nation2.nationborderin_country
fromnationnation1,border,nationnation2
wherenation1.code=border.nation_code
andborder.border_code=nation2.code
orderbynation1.nation;
-----------
-----------
PL/SQL
2PL/SQL的块结构和数据类型
块结构的特点
嵌套
begin
......
begin
......
exception
......
end;
exception
......
end;
标识符:
不能超过30个字符
第一个字符必须为字母
其余字符可以是字母,数字,$,_,或#
不区分大小写形式
如果用双引号括起来,则字符顺序可以任意排列,并区分大小写形式
无SQL保留字
数据类型
数字型:
整数,实数,以及指数
字符串:
用单引号括起来
若在字符串表示单引号,则使用两个单引号
字符串长度为零(两个单引号之间没有字符),则表示NULL
字符:
长度为1的字符串
数据定义
语法
标识符[常数>数据类型[NOTNULL>[:=PL/SQL表达式>;
':='表示给变量赋值
数据类型包括
数字型number(7,2)
字符型char(120)
日期型date
布尔型boolean(取值为true,false或null,不存贮在数据库中)
日期型
anniversarydate:='05-JUL-95';
project_completiondate;
布尔型
over_budgetbooleannotnull:=false;
availableboolean;
(初始值为NULL)
%type类型匹配
books_printednumber(6);
books_soldbook_printed%type;
manager_nameemp.ename%type;
变量赋值
变量名:=PL/SQL表达式
numvar:=5;
boolvar:=true;
datevar:='11-JUN-87';
字符型、数字型表达式中的空值
null+<数字>=null(空值加数字仍是空值)
null><数字>=null(空值与数字进行比较,结果仍是空值)
null||'字符串'='字符串'(null即'')
(空值与字符串进行连接运算,结果为原字符串)
变量作用范围
标识符在宣言它的块中有效
标识符如果不在子块中重新定义,则在PL/SQL块的所有子块中同样有效
重新定义后的标识符,作用范围仅在本子块中有效
例
declare
e_messchar(80);
begin
/*子块1*/
declare
v1number(4);
begin
selectempnointov1fromemp
wherejob='president';
exception
whentoo_many_rowsthen
insertintojob_errors
values('morethanonepresident');
end;
/*子块2*/
declare
v1number(4);
begin
selectempnointov1fromemp
wherejob='manager';
exception
whentoo_many_rowsthen
insertintojob_errors
values('morethanonemanager');
end;
exception
whenothersthen
e_mess:=substr(sqlerrm,1,80);
insertintogeneralerrorsvalues(e_mess);
end;
---------
3SQL和PL/SQL
插入
declare
my_salnumber(7,2):=3040.55;
my_enamechar(25):='wanda';
my_hiredatedate:='08-SEP-88';
begin
insertintoemp
(empno,enmae,job,hiredate,sal,deptno)
values(2741,my_ename,'cabdriver',my_hiredate,my_sal,20);
end;
删除
declare
bad_child_typechar(20):='naughty';
begin
deletefromsantas_gift_listwhere
kid_rating=bad_child_type;
end;
事务处理
commit[WORK>;
rollback[WORK>;
(关键字WORK可选,但对命令执行无任何影响)
savepoint标记名;(保存当前点)
在事务中标记当前点
rollback[WORK>to[SAVEPOINT>标记名;(回退到当前保存点)
取消savepoint命令之后的所有对数据库的修改
关键字WORK和SAVEPOINT为可选项,对命令执行无任何影响
函数
PL/SQL块中可以使用SQL命令的所有函数
insertintophonebook(lastname)value(upper(my_lastname));
selectavg(sal)intoavg_salfromemp;
对于非SQL命令,可使用大多数个体函数
不能使用聚组函数和参数个数不定的函数,如
x:=sqrt(y);
lastname:=upper(lastname);
age_diff:=months_between(birthday1,birthday2)/12;
赋值时的数据类型转换
4种赋值形式:
变量名:=表达式
insertinto基表名values(表达式1,表达式2,...);
update基表名set列名=表达式;
select列名into变量名from...;
数据类型间能进行转换的有:
char转成number
number转成char
char转成date
date转成char
例
char_var:=nm_var;
数字型转换成字符型
date_var:='25-DEC-88';
字符型转换成日期型
insertinto表名(num_col)values('604badnumber');
错误,无法成功地转换数据类型
---------
4条件控制
例
declare
num_jobsnumber(4);
begin
selectcount(*)intonum_jobsfromauditions
whereactoryes';
ifnum_jobs>100then
updateactorsetactor_rating='wordclass'
whereactorid=&&actor_id;
elsifnum_job=75then
updateactorsetactor_rating='daytimesoaps'
whereactorid=&&actor_id;
else
updateactorsetactor_rating='waiter'
whereactorid=&&actor_id;
endif;
endif;
commit;
end;
--------
5循环
语法
loop
......
endloop;
exit;(退出循环)
exit[when>;(退出循环,当满足WHEN时)
例1
declare
ctrnumber(3):=0;
begin
loop
insertintotable1values('tastesgreat');
insertintotable2values('lessfilling');
ctr:=ctr+1;
exitwhenctr=100;
endloop;
end;
(注:如果ctr取为NULL,循环无法结束)
例2
FOR语法
for变量<范围>loop
......
endloop;
declare
my_indexchar(20):='fettucinialfredo';
bowlchar(20);
begin
formy_indexinreverse21..30loop
insertintotemp(coll)values(my_index);
/*循环次数从30到21*/
endloop;
bowl:=my_index;
end;
跟在inreverse后面的数字必须是从小到大的顺序,必须是整数,不能是变量或表达式
----------
6游标
显式游标
打开游标
open<游标名>
例
opencolor_cur;
游标属性
%notfound
%found
%rowcount
%isopen
例
fetchmy_curintomy_var;
whilemy_cur%foundloop
(处理数据)
fetchmy_curintomy_var;
exitwhenmy_cur%rowcount=10;
endloop;
%notfound属性
取值情况如下:
fetch操作没有返回记录,则取值为true
fetch操作返回一条记录,则取值为false
对游标无fetch操作时,取值为null
<游标名>%notfound
例
ifcolor_cur%notfoundthen...
注:如果没有fetch操作,则<游标名>%notfound将导致出错,
因为%notfound的初始值为NULL。
关闭游标
close<游标名>
例
closecolor_cur;
游标的FOR循环
语法
for<记录名>in<游标名>loop
<一组命令>
endloop;
其中:
索引是建立在每条记录的值之上的
记录名不必声明
每个值对应的是记录名,列名
初始化游标指打开游标
活动集合中的记录自动完成FETCH操作
退出循环,关闭游标
隐式游标
隐式游标是指SQL命令中用到的,没有明确定义的游标
insert,update,delete,select语句中不必明确定义游标
调用格式为SQL%
存贮有关最新一条SQL命令的处理信息
隐式游标的属性
隐式游标有四个属性
SQL%NOTFOUND
SQL%FOUND
SQL%ROWCOUNT:隐式游标包括的记录数
例:
deletefrombaseball_teamwherebatting_avg<100;
ifsql%rowcount>5thn
insertintotemp
values('yourteamneedshelp');
endif;
SQL%ISOPEN:取值总为FALSE。SQL命令执行完毕,PL/SQL立即关闭隐式游标。
---------
7标号
GOTO语句
用法:
gotoyou_are_here;
其中you_are_here是要跳转的语句标号
标号必须在同一组命令,或是同一块中使用
正确的使用
<>(标号)
x:=x+1
ifa>bthen
b:=b+c;
gotodinner;
endif;
错误的使用
gotojail;
ifa>bthen
b:=b+c;
<>(标号)
x:=x+1;
endif;
标号:解决意义模糊
标号可用于定义列值的变量
<>
declare
deptnonumber:=20;
begin
updateempsetsal=sal*1.1
wheredeptno=sample.deptno;
commit;
endsample;
如果不用标号和标号限制符,这条命令将修改每条记录。
----------
8异常处理
预定义的异常情况
任何ORACLE错误都将自动产生一个异常信息
一些异常情况已命名,如:
no_data_found当SELECT语句无返回记录时产生
too_many_rows没有定义游标,而SELECT语句返回多条记录时产生
whenevernotfound无对应的记录
用户定义的异常情况
由用户自己获取
在DECLARE部分定义:
declare
xnumber;
something_isnt_rightexception;
用户定义的异常情况遵循一般的作用范围规则
条件满足时,获取异常情况:raisesomething_isnt_right
注意:同样可以获取预定义的异常情况
exception_init语句
允许为ORACLE错误命名
调用格式:
pragmaexception_init(<表达式>,);
例
declare
deadlock_detectedexception;
pragmaexception_init(deadlock_detected,-60);
raise语句
单独使用RAISE命令,可再一次获取当前的异常情况(就象异常情况被重复处理了一样)。
在异常处理中,此语句只能单独使用。
异常处理标识符
一组用于处理异常情况的语句:
exception
when<表达式>or[表达式...>then
<一组语句>
...
whenothersthen--最后一个处理
<一组语句>
end;既结束PL/SQL块部分,也结束异常处理部分
--------
练习与答案
1:
接收contract_no和item_no值,在inventory表中查找,如果产品:
已发货,在arrival_date中赋值为今天后的7天
已订货,在arrival_date中赋值为今天后的一个月
既无订货又无发货,则在arrival_date中赋值为今天后的两个月,
并在order表中增加一条新的订单记录。
product_status的列值为'shipped'和'ordered'
inventory:
product_idnumber(6)
product_descriptionchar(30)
product_statuschar(20)
std_shipping_qtynumber(3)
contract_item:
contract_nonumber(12)
item_nonumber(6)
arrival_datedate
order:
order_idnumber(6)
product_idnumber(6)
qtynumber(3)
答案:
declare
i_product_idinventory.product_id%type;
i_product_descriptioninventory.product_description%type;
i_product_statusinventory.product_status%type;
i_std_shipping_qtyinventory.std_shipping_qty%type;
begin
selectproduct_id,product_description,product_status,std_shipping_qty
intoi_product_id,i_product_description,
i_product_status,i_std_shipping_qty
frominventory
whereproduct_id=(
selectproduct_id
fromcontract_item
wherecontract_no=&&contractnoanditem_no=&&itemno);
ifi_product_status='shipped'then
updatecontract_item
setarrival_date=sysdate+7
whereitem_no=&&itemnoandcontract_no=&&contractno;
elsifi_product_status='ordered'then
updatecontract_item
setarrival_date=add_months(sysdate,1)
whereitem_no=&&itemnoandcontract_no=&&contractno;
else
updatecontract_item
setarrival_date=add_months(sysdate,2)
whereitem_no=&&itemnoandcontract_no=&&contractno;
insertintoorders
values(100,i_product_id,i_std_shipping_qty);
endif;
endif;
commit;
end;
2:
1.找出指定部门中的所有雇员
2.用带'&'的变量提示用户输入部门编号
3.把雇员姓名及工资存入prnttable表中,基结构为:
createtableprnttable
(seqnumber(7),linechar(80));
4.异常情况为,部门中奖金不为空值的雇员信息才能存入prnttable表中。
答案:
declare
cursoremp_curis
selectename,sal,comm
fromempwheredeptno=&dno;
emp_recemp_cur%rowtype;
null_commissionexception;
begin
openemp_cur;
fetchemp_curintoemp_rec;
while(emp_cur%found)loop
ifemp_rec.commisnullthen
begin
closeemp_cur;
raisenull_commission;
end;
endif;
fetchemp_curintoemp_rec;
endloop;
closeemp_sur;
exception
whennull_commissionthen
openemp_cur;
fetchemp_curintoemp_rec;
while(emp_cur%found)loop
ifemp_rec.commisnotnullthen
insertintotempvalues(emp_rec.sal,emp_rec.ename);
endif;
fetchemp_curintoemp_rec;
endloop;
closeemp_cur;
commit;
end;
Java研究组织-版权所有2002-2002
RE:ORACLE数据库对象与用户管理(转)
作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]
ORACLE数据库对象与用户管理
一、ORACLE数据库的模式对象的管理与维护
本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。
1.1表空间
由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。
创建表空间
SQL>CREATETABLESPACEjxzy
>DATAFILE‘/usr/oracle/dbs/jxzy.dbf’
>ONLINE;
修改表空间
SQL>ALTERTABLESPACEjxzyOFFLINENORMAL;
SQL>ALTERTABLESPACEjxzy
>RENAMEDATAFILE‘/usr/oracle/dbs/jxzy.dbf’
>TO‘/usr/oracle/dbs/jxzynew.dbf’
>ONLINE
SQL>CREATETABLESPACEjxzyONLINE
删除表空间
SQL>DROPTABLESPACEjxzy
>INCLUDINGCONTENTS
1.2表维护
表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。
表的建立
SQL>CREATETABLEjxzy.switch(
>OFFICE_NUMNUMBER(3,0)NOTNULL,
>SWITCH_CODENUMBER(8,0)NOTNULL,
>SWITCH_NAMEVARCHAR2(20)NOTNULL);
表的修改
SQL>ALTERTABLEjxzy.switch
>ADD(DESCVARCHAR2(30));
表的删除
SQL>DROPTABLEjxzy.switch
>CASCADECONSTRAINTS
//删除引用该表的其它表的完整性约束
1.3视图维护
视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。
视图的建立
SQL>CREATEVIEWjxzy.pole_well_viewAS
>(SELECTpole_path_numASpath,
poleASdevice_numFROMpole
>UNION
>SELECTpipe_path_numASpath,
>wellASdevice_numFROMwell);
视图的替换
SQL>REPLACEVIEWjxzy.pole_well_viewAS
>(SELECTpole_path_numASpath,
poleASsupport_deviceFROMpole
>UNION
>SELECTpipe_path_numASpath,
wellASsupport_deviceFROMwell);
视图的删除
SQL>DROPVIEWjxzy.pole_well_view;
1.4序列维护
序列是由序列发生器生成的唯一的整数。
序列的建立
SQL>CREATESEQUENCEjxzy.sequence_cable
>STARTWITH1
>INCREMENTBY1
>NO_MAXVALUE;
建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval返回当前值加1后的新值
序列的修改
SQL>ALTERSEQUENCEjxzy.sequence_cable
>STARTWITH1//起点不能修改,若修改,应先删除,然后重新定义
>INCTEMENTBY2
>MAXVALUE1000;
序列的删除
SQL>DROPSEQUENCEjxzy.sequence_cable
1.5索引维护
索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。
对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。
索引分唯一索引和非唯一索引
索引的建立
SQL>CREATEINDEXjxzy.idx_switch
>ONswitch(switch_name)
>TABLESPACEjxzy;
索引的修改
SQL>ALTERINDEXjxzy.idx_switch
>ONswitch(office_num,switch_name)
>TABLESPACEjxzy;
索引的删除
SQL>DROPINDEXjxzy.idx_switch;
1.6完整性约束管理
数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。
完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.
a.NOTNULL非空
b.UNIQUE唯一关键字
c.PRIMATYKEY主键一个表只能有一个,非空
d.FOREIGAKEY外键
e.CHECK表的每一行对指定条件必须是true或未知(对于空值)
例如:
某列定义非空约束
SQL>ALTERTABLEoffice_organization
>MODIFY(descVARCHAR2(20)
>CONSTRAINTnn_descNOTNULL)
某列定义唯一关键字
SQL>ALTERTABLEoffice_organization
>MODIFY(office_nameVATCHAR2(20)
>CONSTRAINTuq_officenameUNIQUE)
定义主键约束,主键要求非空
SQL>CREATETABLEswitch(switch_codeNUMBER(8)
>CONSTRAINTpk_switchcodePRIMARYKEY,)
使主键约束无效
SQL>ALTERTABLEswitchDISABLEPRIMARYKEY
定义外键
SQL>CREATETABLEPOLE(pole_codeNUMBER(8),
>office_numnumber(3)
>CONSTRAINTfk_officenum
>REFERENCESoffice_organization(office_num)
>ONDELETECASCADE);
定义检查
SQL>CREATETABLEoffice_organization(
>office_numNUMBER(3),
>CONSTRAINTcheck_officenum
>CHECK(office_numBETWEEN10AND99);
二、ORACLE数据库用户与权限管理
ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。
2.1ORACLE数据库安全策略
建立系统级的安全保证
系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。
建立对象级的安全保证
对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。
建立用户级的安全保证
用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。
2.2用户管理
ORACLE用户管理的内容主要包括用户的建立、修改和删除
用户的建立
SQL>CREATEUSERjxzy
>IDENTIFIEDBYjxzy_password
>DEFAULTTABLESPACEsystem
>QUATA5MONsystem;//供用户使用的最大空间限额
用户的修改
SQL>CREATEUSERjxzy
>IDENTIFIEDBYjxzy_pw
>QUATA10MONsystem;
删除用户及其所建对象
SQL>DROPUSERjxzyCASCADE;//同时删除其建立的实体
2.3系统特权管理与控制
ORACLE提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。
授予系统特权
SQL>GRANTCREATEUSER,ALTERUSER,DROPUSER
>TOjxzy_new
>WITHADMINOPTION;
回收系统特权
SQL>REVOKECREATEUSER,ALTERUSER,DROPUSER
>FROMjxzy_new
//但没有级联回收功能
显示已被授予的系统特权(某用户的系统级特权)
SQL>SELECT*FROMsys.dba_sys_privs
2.4对象特权管理与控制
ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。
授予对象特权
SQL>GRANTSELECT,INSERT(office_num,office_name),
>UPDATE(desc)ONoffice_organization
>TOnew_adminidtrator
>WITHGRANTOPTION;
//级联授权
SQL>GRANTALLONoffice_organization
>TOnew_administrator
回收对象特权
SQL>REVOKEUPDATEONoffice_orgaization
>FROMnew_administrator
//有级联回收功能
SQL>REVOKEALLONoffice_organization
>FROMnew_administrator
显示已被授予的全部对象特权
SQL>SELECT*FROMsys.dba_tab_privs
2.5角色的管理
ORACLE的角色是命名的相关特权组(包括系统特权与对象特权),ORACLE用它来简化特权管理,可把它授予用户或其它角色。
ORACLE 数据库系统预先定义了CONNECT、RESOURCE、DBA、EXP_FULL_DATABASE、IMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权;RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权; EXP_FULL_DATABASE、IMP_FULL_DATABASE具有卸出与装入数据库的特权。
通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。
授予用户角色
SQL>GRANTDBATOnew_administractor
>WITHGRANTOPTION;
作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]
ORACLE数据库对象与用户管理
一、ORACLE数据库的模式对象的管理与维护
本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。
1.1表空间
由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。
创建表空间
SQL>CREATETABLESPACEjxzy
>DATAFILE‘/usr/oracle/dbs/jxzy.dbf’
>ONLINE;
修改表空间
SQL>ALTERTABLESPACEjxzyOFFLINENORMAL;
SQL>ALTERTABLESPACEjxzy
>RENAMEDATAFILE‘/usr/oracle/dbs/jxzy.dbf’
>TO‘/usr/oracle/dbs/jxzynew.dbf’
>ONLINE
SQL>CREATETABLESPACEjxzyONLINE
删除表空间
SQL>DROPTABLESPACEjxzy
>INCLUDINGCONTENTS
1.2表维护
表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。
表的建立
SQL>CREATETABLEjxzy.switch(
>OFFICE_NUMNUMBER(3,0)NOTNULL,
>SWITCH_CODENUMBER(8,0)NOTNULL,
>SWITCH_NAMEVARCHAR2(20)NOTNULL);
表的修改
SQL>ALTERTABLEjxzy.switch
>ADD(DESCVARCHAR2(30));
表的删除
SQL>DROPTABLEjxzy.switch
>CASCADECONSTRAINTS
//删除引用该表的其它表的完整性约束
1.3视图维护
视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。
视图的建立
SQL>CREATEVIEWjxzy.pole_well_viewAS
>(SELECTpole_path_numASpath,
poleASdevice_numFROMpole
>UNION
>SELECTpipe_path_numASpath,
>wellASdevice_numFROMwell);
视图的替换
SQL>REPLACEVIEWjxzy.pole_well_viewAS
>(SELECTpole_path_numASpath,
poleASsupport_deviceFROMpole
>UNION
>SELECTpipe_path_numASpath,
wellASsupport_deviceFROMwell);
视图的删除
SQL>DROPVIEWjxzy.pole_well_view;
1.4序列维护
序列是由序列发生器生成的唯一的整数。
序列的建立
SQL>CREATESEQUENCEjxzy.sequence_cable
>STARTWITH1
>INCREMENTBY1
>NO_MAXVALUE;
建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval返回当前值加1后的新值
序列的修改
SQL>ALTERSEQUENCEjxzy.sequence_cable
>STARTWITH1//起点不能修改,若修改,应先删除,然后重新定义
>INCTEMENTBY2
>MAXVALUE1000;
序列的删除
SQL>DROPSEQUENCEjxzy.sequence_cable
1.5索引维护
索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。
对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。
索引分唯一索引和非唯一索引
索引的建立
SQL>CREATEINDEXjxzy.idx_switch
>ONswitch(switch_name)
>TABLESPACEjxzy;
索引的修改
SQL>ALTERINDEXjxzy.idx_switch
>ONswitch(office_num,switch_name)
>TABLESPACEjxzy;
索引的删除
SQL>DROPINDEXjxzy.idx_switch;
1.6完整性约束管理
数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。
完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.
a.NOTNULL非空
b.UNIQUE唯一关键字
c.PRIMATYKEY主键一个表只能有一个,非空
d.FOREIGAKEY外键
e.CHECK表的每一行对指定条件必须是true或未知(对于空值)
例如:
某列定义非空约束
SQL>ALTERTABLEoffice_organization
>MODIFY(descVARCHAR2(20)
>CONSTRAINTnn_descNOTNULL)
某列定义唯一关键字
SQL>ALTERTABLEoffice_organization
>MODIFY(office_nameVATCHAR2(20)
>CONSTRAINTuq_officenameUNIQUE)
定义主键约束,主键要求非空
SQL>CREATETABLEswitch(switch_codeNUMBER(8)
>CONSTRAINTpk_switchcodePRIMARYKEY,)
使主键约束无效
SQL>ALTERTABLEswitchDISABLEPRIMARYKEY
定义外键
SQL>CREATETABLEPOLE(pole_codeNUMBER(8),
>office_numnumber(3)
>CONSTRAINTfk_officenum
>REFERENCESoffice_organization(office_num)
>ONDELETECASCADE);
定义检查
SQL>CREATETABLEoffice_organization(
>office_numNUMBER(3),
>CONSTRAINTcheck_officenum
>CHECK(office_numBETWEEN10AND99);
二、ORACLE数据库用户与权限管理
ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。
2.1ORACLE数据库安全策略
建立系统级的安全保证
系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。
建立对象级的安全保证
对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。
建立用户级的安全保证
用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。
2.2用户管理
ORACLE用户管理的内容主要包括用户的建立、修改和删除
用户的建立
SQL>CREATEUSERjxzy
>IDENTIFIEDBYjxzy_password
>DEFAULTTABLESPACEsystem
>QUATA5MONsystem;//供用户使用的最大空间限额
用户的修改
SQL>CREATEUSERjxzy
>IDENTIFIEDBYjxzy_pw
>QUATA10MONsystem;
删除用户及其所建对象
SQL>DROPUSERjxzyCASCADE;//同时删除其建立的实体
2.3系统特权管理与控制
ORACLE提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。
授予系统特权
SQL>GRANTCREATEUSER,ALTERUSER,DROPUSER
>TOjxzy_new
>WITHADMINOPTION;
回收系统特权
SQL>REVOKECREATEUSER,ALTERUSER,DROPUSER
>FROMjxzy_new
//但没有级联回收功能
显示已被授予的系统特权(某用户的系统级特权)
SQL>SELECT*FROMsys.dba_sys_privs
2.4对象特权管理与控制
ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。
授予对象特权
SQL>GRANTSELECT,INSERT(office_num,office_name),
>UPDATE(desc)ONoffice_organization
- 上一篇 »二十四、oracle pl/sql 变量
- 下一篇 »oracle,sql基础篇系列