Oracle PL/SQL 编程手册(SQL大全)

一、SQL�PLUS�
1�引言�

SQL命令�
以下17个是作为语句开头的关键字:�
alter�drop�revoke�
audit�grant�rollback*�
commit*�insert�select�
comment�lock�update�
create�noaudit�validate�
delete�rename�
这些命令必须以“;”结尾�
带*命令句尾不必加分号,并且不存入SQL缓存区。�

SQL中没有的SQL*PLUS命令�
这些命令不存入SQL缓存区�
@�define�pause�
#�del�quit�
$�describe�remark�
/�disconnect�run�
accept�document�save�
append�edit�set�
break�exit�show�
btitle�get�spool�
change�help�sqlplus�
clear�host�start�
column�input�timing�
compute�list�ttitle�
connect�newpage�undefine�
copy�

---------�
2�数据库查询�

数据字典�
TAB�用户创建的所有基表、视图和同义词清单�

DTAB�构成数据字典的所有表�

COL�用户创建的基表的所有列定义的清单�

CATALOG�用户可存取的所有基表清单�

select�*�from�tab;�

describe命令�描述基表的结构信息�
describe�dept�

select�*�
from�emp;�

select�empno,ename,job�
from�emp;�

select�*�from�dept�
order�by�deptno�desc;�

逻辑运算符�
=�!=或<>�>�>=�<�<=�
in�
between�value1�and�value2�
like�
%�
_�
in�null�
not�
no�in,is�not�null�

谓词in和not�in�
有哪些职员和分析员�
select�ename,job�
from�emp�
where�job�in�('clerk','analyst');�

select�ename,job�
from�emp�
where�job�not�in�('clerk','analyst');�

谓词between和not�between�
哪些雇员的工资在2000和3000之间�
select�ename,job,sal�from�emp�
where�sal�between�2000�and�3000;�

select�ename,job,sal�from�emp�
where�sal�not�between�2000�and�3000;�

谓词like,not�like�
select�ename,deptno�from�emp�
where�ename�like�'S%';�
(以字母S开头)�
select�ename,deptno�from�emp�
where�ename�like�'%K';�
(以K结尾)�
select�ename,deptno�from�emp�
where�ename�like�'W___';�
(以W开头,后面仅有三个字母)�
select�ename,job�from�emp�
where�job�not�like�'sales%';�
(哪些雇员的工种名不以sales开头)�

谓词is�null,is�not�null�
没有奖金的雇员(即commision为null)�
select�ename,job�from�emp�
where�comm�is�null;�

select�ename,job�from�emp�
where�comm�is�not�null;�

多条件查询�
select�ename,job�
from�emp�
where�deptno=20�
and�job!='clerk';�

表达式�
+�-�*�/�

算术表达式�
选择奖金高于其工资的5%的雇员�
select�ename,sal,comm,comm/sal�from�emp�
where�comm>.05*sal�
order�by�comm/sal�desc;�

日期型数据的运算�
add�two�days�to�6-Mar-87�
6-Mar-87�+�2�=�8-Mar-87�
add�two�hours�to�6-Mar-87�
6-Mar-87�+�2/24�=�6-Mar-87�and�2hrs�
add�15�seconds�to�6-Mar-87�
6-Mar-87�+�15/(24*60*60)�=�6-Mar-87�and�15�secs�

列名的别名�
select�ename�employee�from�emp�
where�deptno=10;�
(别名:employee)�
select�ename,sal,comm,comm/sal�"C/S�RATIO"�from�emp�
where�comm>.05*sal�
order�by�comm/sal�desc;�

SQL命令的编辑�
list�or�l�显示缓冲区的内容�
list�4�显示当前SQL命令的第4行,并把第4行作为当前行,在该行号后面有个*。�
change�or�c�用新的内容替换原来在一行中第一次出现内容�
SQL>c/(...)/('analyst')/�
input�or�i�增加一行或多行�
append�or�a�在一行后追加内容�
del�删除当前行�删除SQL缓冲区中的当前行�
run�显示并运行SQL缓冲区中的命令�
/�运行SQL缓冲区中的命令�
edit�把SQL缓冲区中的命令写到操作系统下的文本文件,�
并调用操作系统提供的编辑器执行修改。�

-------------�
3�数据操纵�
数据的插入�
insert�into�dept�
values�(10,'accounting','new�york');�

insert�into�dept�(dname,deptno)�
values�('accounting',10);�

从其它表中选择插入数据�
insert�into�emp�(empno,ename,deptno)�
select�id,name,department�
from�old_emp�
where�department�in(10,20,30,40);�

使用参数�
insert�into�dept�
values(&deptno,&dname,&loc);�
执行时,SQL/PLUS对每个参数将有提示用户输入�

参数对应日期型或字符型数据时,可在参数上加引号,输入时就可不用引号�
insert�into�dept�
values(&deptno,'&dname','&loc');�

插入空值(NULL)�
insert�into�dept�
values(50,'education',null);�

插入日期型数据�
日期型数据缺省格式:DD-MON-YY�
insert�into�emp�
(empno,ename,hiredate)�
values(7963,'stone','07-APR-87');�

系统时间:SYSDATE�
insert�into�emp�
(empno,ename,hiredate)�
values(7600,'kohn',SYSDATE);�

数据更新�
update�emp�
set�job='manager'�
where�ename='martin';�

update�emp�
set�job='market�rep'�
where�ename='salesman';�

update�emp�
set�deptno=40,job='market�rep'�
where�job='salesman';�

数据删除�
delete�emp�
where�empno=765;�

更新的提交�
commit�

自动提交方式�
set�autocommit�on�
如果状态设为开,则使用inesrt,update,delete会立即提交。�

更新取消�
rollback�

两次连续成功的commit之间的操作,称为一个事务�

---------------�
4�创建基表、视图�
创建基表�
create�table�dept�
(deptno�number(2),�
dname�char(14),�
loc�char(13));�

数据字典会自动更新。�
一个基表最多254列。�

表名列名命名规则:�
限制�
第一个字符必须是字母,后面可任意(包括�$�#�_�但不能是逗号)。�
名字不得超过30个字符。�

唯一�
某一用户的基表名必须唯一,不能是ORACLE的保留字,同一基表的列名互不相同。�

使用双引号�
如果表名用双引号括起来,则可不满足上述规则;�
只有使用双引号,才能区别大、小写;�
命名时使用了双引号,在以后的操作也必须使用双引号。�

数据类型:�
char(n)�(不得超过240字符)�
number(n,d)�
date�
long�(最多65536字符)�
raw�(二进制原始数据)�

空值处理�
有时要求列值不能为空�
create�table�dept�
(deptno�number(2)�not�null,�
dname�char(14),�
loc�char(13));�

在基表中增加一列�
alter�table�dept�
add�(headcnt�number(3));�

修改已有列属性�
alter�table�dept�
modify�dname�char(20);�
注:只有当某列所有值都为空时,才能减小其列值宽度。�
只有当某列所有值都为空时,才能改变其列值类型。�
只有当某列所有值都为不空时,才能定义该列为not�null。�
例:�
alter�table�dept�modify�(loc�char(12));�
alter�table�dept�modify�loc�char(12);�
alter�table�dept�modify�(dname�char(13),loc�char(12));�

创建视图�
create�view�managers�as�
select�ename,job,sal�
from�emp�
where�job='manager';�

为视图列名取别名�
create�view�mydept�
(person,title,salary)�
as�select�ename,job,sal�
from�emp�
where�deptno=10;�

with�check�option选项�
使用with�check�option,保证当对视图插入或更新数据时,�
该数据必须满足视图定义中select命令所指定的条件。�
create�view�dept20�as�
select�ename,job,sal,deptno�
from�emp�
where�deptno=20�
with�check�option;�
在做下述操作时,会发生错误�
update�dept20�
set�deptno=30�
where�ename='ward';�

基表、视图的拷贝�
create�table�emp2�
as�select�*�from�emp;�

基表、视图的删除�
drop�table�表名�
drop�view�视图名�

------------�
5�SQL*PLUS报表功能�
SQL*PLUS的一些基本格式命令�
column�deptno�heading�department�

column�ename�heading�name�

column�sal�heading�salary�

column�sal�format�$99,999.00�

ttitle�sample�report�for|hitech�corp�

btitle�strictly�confidential�

break�on�deptno�

compute�sum�of�sal�on�deptno�

run�

表头和表尾�
ttitle�sample�report�for|hitech�corp�
btitle�right�strictly�confidential�

“|”表示换行,结尾不必加分号�
选项有三种:left�right�center�

使用TTITLE,系统将自动地在每页的顶部显示日期和页号。�
TTITLET和BTITLE命令有效,直至重新设置表头或表尾,或退出SQL*PLUS。�

下面命令使标题语句失效�
TTITLE�OFF�
BTITLE�OFF�

列名�
column命令定义用于显示列名�
若名字为一个单词,不必加引号�
column�ename�heading�employee�

column�ename�heading�'employee|name'�
(|为换行)�

取消栏定义�
column�ename�clear�

列的格式�
column�ename�format�A15�

column�sal�format�$9,999.99�

column�comm�like�sal�

like子句,使得某一列的格式参照另一列格式,它拷贝列名及其格式�

控制记录显示分组顺序�
break�on�deptno�
(不显示重复值)�

select�deptno,ename�
from�emp�
order�by�deptno;�
(ORDER�BY子句用于控制BREAK)�

显示为�
10�clark�
niller�
20�smith�
scott�
30�allen�
blake�

每次只有一个BREAK命令起作用,但一次可以在多个列上使用BREAK命令�
break�on�列名1�on�列名2�

记录分组�
break�on�deptno�skip�2�
select�deptno,ename�
from�emp�
order�by�deptno;�

每个deptno之间空两行�
clear�break(取消BREAK命令)�
break�on�page(每次从一新页开始)�
break�on�report(每次从一新报表开始)�
break�on�page�on�report(联合使用)�

分组计算�
break�on�deptno�skip�2�
compute�sum�of�sal�on�deptno�
计算每个部门的工资总和�
skip子句使部门之间的信息分隔开�

其他计算命令�
compute�avg�of�sal�on�deptno(平均值)�
count�非空值的总数�
MAX�最大值�
MIN�最小值�
STD�标准偏差�
VAR�协方差�
NUMBER�行数�

使compute命令失效�
一旦定义了COMPUTE,则一直有效,直到�
关闭COMPUTE(clear�compute)�

SQL/PLUS环境命令�
show�选项�
(显示当前参数设置情况)�

show�all(显示全部参数)�

设置参数�
set�选项�值或开关�

set�autocommit�on�

SET命令包括�
set�autocommit�{off|on|immediate}�
(自动提交,OFF缺省)�

set�echo�{off|on}�
(命令文件执行,是否在终端上显示命令本身,OFF缺省)�

set�feedback�{off|on}�
(ON:查询结束时,给出结果,记录数的信息,缺省;�
OFF:无查询结果,记录数的信息)�

set�heading�{off|on}�
(ON:列的头标在报表上显示,缺省;OFF:不在报表上显示)�

set�linesize�{n}�
一行显示的最大字符数,缺省为80�

set�pagesize�{n}�
每页的行数,缺省是14�

set�pause�{off|on|text}�
(ON:当报表超过一页时,每显示一屏就暂停显示,等待用户打回车键,再接着显示;�
OFF:页与页不停顿,缺省;text:页与页停顿,并向用户提示信息)�

SET�BUFFER�buffer�
设置当头的命令缓冲区,通常情况下,SQL命令缓冲区已为当前缓冲区。�
由于SQL命令缓冲区只能存放一条SQL命令,�
所以可用其它缓冲区来存放SQL命令和SQL*PLUS命令。�

经常用到的设置可放在login.sql文件中。�

SET�NULL�
set�null�'no�data'�

select�ename,comm�
from�emp�
where�deptno=30;�
把部门30中无佣金雇员的佣金显示为“NO�DATA”。�

set�null是SQL*PLUS命令,用它来标识空值(NULL),可以设置为任意字符串。�

存盘命令SAVE�
save�文件名�

input�
1�select�empno,ename,job�
2�from�emp�
3�where�job='analyst'�

save�research�

目录中会增加一个research.sql文件。�

编辑命令EDIT�
edit�

EDIT编辑当前缓冲区中的内容。�

编辑一个文件�
edit�research�

调入命令GET�
get�research�
把磁盘上的文件内容调入缓冲区,并显示在屏幕上,文件名尾不必加.sql。�

START命令�
运行指定的文件�
start�research�

输出命令SPOOL�
spool�tryfile�
不仅可以使查询结果在屏幕上显示,还可以使结果存入文件�

停止向文件输出�
spool�off�

把查询结果在打印机上输出,先把它们存入一个文件中,�
然后不必使用SPOOL�OFF,而用:�
spool�out�
SPOOL�OUT关闭该文件并在系统缺省的打印机上输出�

制作报表举例�
edit�tryfile�

set�echo�off�
set�autocommit�on�
set�pagesize�25�
insert�into�emp�(empno,ename,hiredate)�
values(9999,'geiger',sysdate);�
insert�into�emp�(empno,ename,deptno)�
values(3333,'samson',20);�
spool�new_emp�
select�*�from�emp�
where�deptno=20�
or�deptno�is�null�
/�
spool�off�
set�autocommit�off�

用start命令执行这个文件�

--------�
6�函数�
字符型函数�
initcap(ename);将ename中每个词的第一个字母改为大写。�
如:jack�smith--Jack�Smith�

length(ename);计算字符串的长度。�

substr(job,1,4);�

其它�
lower�
upper�
least�取出字符串列表中按字母排序排在最前面的一个串�
greatest�取出字符串列表中按字母排序排在最后的一个串�

日期函数�
add_month(hiredate,5)�在雇佣时间上加5个月�
month_between(sysdate,hiredate)�计算雇佣时间与系统时间之间相差的月数�
next_day(hiredate,'FRIDAY')�计算受雇日期之后的第一个星期五的日期�

例�
select�ename,sal,next_day(sysdate,'FRIDAY')�as_of�
from�emp�
where�deptno=20;�
(as_of是别名)�

如果不用to_char函数,日期在ORACLE中的缺省格式是'DD_MON_YY'�
to_char(date,date�picture)�

select�ename,to_char(hiredate,'Dy�Mon�dd,yyyy')�hired�
from�emp�
where�deptno=10;�

to_date(字符串,格式)�

insert�into�emp(empno,ename,hiredate)�
values(7999,'asms',to_date('070387083000','MMDDYYHHMISS'));�

日期型数据的格式�
dd�12�
dy�fri�
day�friday�
ddspth�twelfth�

mm�03�
mon�mar�
month�march�

yy�87�
yyyy�1987�

例�
Mar�12,1987�'Mon�dd,yyyy'�
MAR�12,1987�'MON�dd,yyyy'�
Thursday�MARCH�12�'Day�MONTH�dd'�
Mar�12�11:00am�'Mon�dd�hh:miam'�
Thu,the�twelfth�'Dy,"the"ddspth'�

算术函数�
least(v1,v2)�

select�ename,empno,mgr,least(empno,mgr)�lownum�
from�emp�
where�empno0�

trunc(sal,0)�
取sal的近似值(截断)�

空值函数�
nvl(v1,v2)�
v1为列名,如果v1不是空值,nvl返回其列值。�
v1为空值,返回v2的值。�

聚组函数�
select�sum(comm)�
from�emp;�
(返回一个汇总信息)�
不能把sum用在select语句里除非用group�by�

字符型、日期型、数字型的聚组函数�
min�max�count可用于任何数据类型�

select�min(ename)�
from�emp;�

select�min(hiredate)�
from�emp;�

select�min(sal)�
from�emp;�

有多少人有工作?�
select�count(job)�
from�emp;�

有多少种不同的工种?�
select�count(distinct�job)�
from�emp;�

count�distinct�计算某一字段中不同的值的个数�

其它聚组函数(只用于数字型数据)�
avg�计算平均工资�
select�avg(sal)�
from�emp;�

stddev�计算工资的平均差�
select�stddev(sal)�
from�emp;�

sum�计算总工资�
select�sum(sal)�
from�emp;�

group�by子句�
select�deptno,sum(sal),avg(sal)�
from�emp�
group�by�deptno;�

按多个条件分组�
每个部门的雇员数�
select�deptno,count(*)�
from�emp�
group�by�deptno;�

每个部门的每个工种的雇员数�
select�deptno,job,count(*)�
from�emp�
group�by�deptno,job;�

满足条件的分组�
(where是针对select的,having是针对group�by的)�
哪些部门的工资总和超过了9000�
select�deptno,sum(sal)�
from�emp�
group�by�deptno�
having�sum(sal)>9000;�

select小结�
除去职员,哪些部门的工资总和超过了8000�
select�deptno,sum(sal)�
from�emp�
where�job!='clerk'�
group�by�deptno�
having�sum(sal)>8000�
order�by�sum(sal);�

---------�
7�高级查询�
等值联接�
select�empno,ename,job,emp.deptno,dname�
from�emp,dept�
where�emp.deptno=dept.deptno;�

外联接�
select�ename,dept.deptno,loc�
from�emp,dept�
where�emp.deptno(+)=dept.deptno;�
如果在dept.deptno中有的数值,在emp.deptno中没有(如deptno=40),�
则作外联接时,结果中会产生一个空值�

自联接:同一基表的不同行要做联接,可使用自联接�
指出每个雇员的经理名字�
select�worker.ename,manager.ename�manager�
from�emp�worker,emp�manager�
where�worker.mgr=manager.empno;�

非等值联接�
哪些雇员的工资属于第三级别�
select�ename,sal�
from�emp,salgrade�
where�grade=3�
and�sal�between�losal�and�hisal;�
(基表salgrade:grade�losal�hisal)�

集合运算�
行的连接�
集合运算把2个或多个查询结果合并为一个�
union-set�union�
Rows�of�first�query�plus�of�second�query,�less�duplicate�rows�

intersect-set�intersection�
Rows�both�queries�have�in�common�

minus-set�difference�
rows�unique�to�the�first�query�

介绍几个视图�
account�view�
ename�sal�job�

sales�view�
ename�sal�job�

research�view�
ename�sal�job�

union运算�
返回一个查询结果中有但又不重要的行,它将基表或视图中的记录合并在一起�
所有部门中有哪些雇员工资超过2000�
对应列的数据类型必须相同�
select�ename,sal�
from�account�
where�sal>2000�
union�
select�ename,sal�
from�research�
where�sal>2000�
union�
select�ename,sal�
from�sales�
where�sal>2000;�

intersect运算�
返回查询结果中相同的部分�
各个部门中有哪些相同的工种�
select�job�
from�account�
intersect�
select�job�
from�research�
intersect�
select�job�
from�sales;�

minus运算�
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。�
有哪些工种在财会部中有,而在销售部中没有?�
select�job�from�account�
minus�
select�job�from�sales;�

子查询�
slect�ename,deptno�
from�emp�
where�deptno=�
(select�deptno�
from�emp�
where�ename='smith');�

多级子查询�
select�ename,job,sal�
from�emp�
where�job=�
(select�job�
from�emp�
where�ename='clark')�
or�sal>�
(select�sal�
from�emp�
where�ename='clark');�

多个基表与子查询�
select�ename,job,sal�
from�emp,dept�
where�loc='new�york'�
and�emp.deptno=dept.deptno�
and�sal>�
(select�sal�
from�emp�
where�ename='scott');�

子查询中使用聚组函数�
select�ename,hiredate�
from�emp�
where�hiredate=�
(select�min(hiredate)�
from�emp);�

------------�
8�授权�
系统权限�
DBA�所有权限�
RESOURCE�注册,创建新的基表�
CONNECT,注册,查询�

只有DBA才有权创建新的用户�
grant�connect�to�scott�
identified�by�tiger;�

DBA或用户自己可以改变用户口令�
grant�connect�to�scott�
identified�by�leopard;�

基表权限1�
有两种方法获得对基表操作的权限�

创建自己的基表�
获得基表创建用户的许可�
grant�select,insert�
on�emp�
to�scott;�

这些权限有�
select�insert�update�delete�alter�index�

把所有权限授于他人�
grant�all�on�emp�to�scott;�

同义词�
select�*�
from�scott.emp�

创建同义词�
为用户allen的EMP基表创建同义词employee�
create�synonym�employee�
for�allen.emp�

基表权限2�
你可以使其他用户有这样的权力,即其他用户可以把你的基表权限授予他人�
grant�all�
on�emp�
to�scott�
with�grant�option;�

收回权限�
系统权限�只有被DBA收回�

基表权限�随时都可以收回�

revoke�insert�
on�emp�
from�scott;�

---------�
9�索引�
建立索引�
create�index�emp_ename�
on�emp(ename);�

删除索引�
drop�index�emp_ename;�

关于索引�
只对较大的基表建立索引(至少50条记录)�
建立索引之前插入数据�
对一个基表可建立任意多个索引�
一般是在作为主键的列上建立索引�
建立索引之后,不影响SQL命令的执行�
建立索引之后,ORACLE自动维护和使用索引�

保证数据唯一性�
提高执行速度的同时,索引还可以保证每个记录中的每个列值是不重复的。�
create�unique�index�emp_empno�
on�emp(empno);�

--------�
练习和答案�

有没有工资比奖金多的雇员?如果有,按工资的降序排列。�
如果有两个以上的雇员工资相同,按他们的名字排序。�
select�ename�employee,sal�salary,comm�commision�
from�emp�
where�sal>comm�
order�by�sal�desc,ename;�

列出有关雇员姓名、奖金占收百分比的信息。�
要求显示时列名意义明确,按雇员姓名排序,不包括奖金未知的雇员。�
select�ename�employee,(comm/(comm+sal))*100�incentive�
from�emp�
where�comm�is�not�null�
order�by�ename;�

在chicago(部门30)工作的所有雇员的工资上涨10%。�
update�emp�
set�sal=1.1*sal�
where�deptno=30;�

update�emp�
set�sal=1.1*sal�
where�deptno=(select�deptno�
from�dept�
where�loc='chicago');�

为hitech公司新建一个部门,编号为50,其它信息均不可知。�
insert�into�dept(dname,deptno)�
values('faclities',50);�

创建视图,三个列名,其中不包括职员信息�
create�view�employee("employee�name",�
"employee�number",�
"employee�job")�
as�select�ename,empno,job�
from�emp�
where�job!='clerk';�

制作工资报表,包括雇员姓名、受雇时间(按星期计算),工资和部门编号,�
一页显示一个部门的信息,每页尾,显示该页的工资之和以及受雇时间之和,�
报表结尾处,显示所有雇员的工资总和以及受雇时间总和,�
工资按美元计算,受雇时间按星期计算,每页的上方应有标题。�
ttitle�'service'�
break�on�deptno�on�page�on�report�
compute�sum�of�sal�on�deptno�
compute�sum�of�sal�on�report�
compute�sum�of�service_length�on�deptno�
compute�sum�of�service_length�on�report�
column�sal�format�$99,999.00�
column�service_length�format�9999�
select�deptno,ename�employee,(sysdate-hiredate)/7�service_length,sal�
from�emp�
order�by�deptno;�

制作报表,包括雇员姓名、总收入和受佣日期,�
且:姓名的第一个字母必须大写,雇佣日期格式为MM/DD/YYYY,�
总收入包括没有奖金的雇员的总收入,姓名按字母顺序排列。�
col�"hire�date"format�A12�
col�"employee"�format�A10�
col�"compensation"�format�$99,999.00�
select�initcap(ename)�"employee",�
(sal+nvl(comm,0))�"compensation",�
to_char(hiredate,'MM/DD/YYYY')�"hire�date"�
from�emp�
order�by�ename;�

列出有超过7个周边国家的国家名字和面积。�
select�nation,area�
from�nation�
where�code�in�
(select�nation_code�
from�border�
group�by�nation_code�
having�count(*)>7);�

列出所有面积大于等于日本的岛国的国名和人口。�
select�nation,population�
from�nation,border�
where�code=nation_code(+)�
and�nation_code�is�null�
and�area>=�
(select�area�
from�nation�
where�upper(nation)='JAPAN');�

列出所有边界在其它国家中的国名,并且显示其边界国家名字。�
break�on�nation�
select�nation1.nation,�
nation2.nation�borderin_country�
from�nation�nation1,border,nation�nation2�
where�nation1.code=border.nation_code�
and�border.border_code=nation2.code�
order�by�nation1.nation;�

-----------�
-----------�
PL/SQL�

2�PL/SQL的块结构和数据类型�

块结构的特点�
嵌套�
begin�
......�
begin�
......�
exception�
......�
end;�
exception�
......�
end;�

标识符:�
不能超过30个字符�
第一个字符必须为字母�
其余字符可以是字母,数字,$,_,或#�
不区分大小写形式�
如果用双引号括起来,则字符顺序可以任意排列,并区分大小写形式�
无SQL保留字�

数据类型�
数字型:�
整数,实数,以及指数�

字符串:�
用单引号括起来�
若在字符串表示单引号,则使用两个单引号�
字符串长度为零(两个单引号之间没有字符),则表示NULL�

字符:�
长度为1的字符串�

数据定义�
语法�
标识符[常数>�数据类型[NOT�NULL>[:=PL/SQL表达式>;�
':='表示给变量赋值�

数据类型包括�
数字型�number(7,2)�
字符型�char(120)�
日期型�date�
布尔型�boolean(取值为true,false或null,不存贮在数据库中)�

日期型�
anniversary�date:='05-JUL-95';�
project_completion�date;�

布尔型�
over_budget�boolean�not�null:=false;�
available�boolean;�
(初始值为NULL)�

%type类型匹配�
books_printed�number(6);�
books_sold�book_printed%type;�
manager_name�emp.ename%type;�

变量赋值�
变量名:=PL/SQL表达式�
numvar:=5;�
boolvar:=true;�
datevar:='11-JUN-87';�

字符型、数字型表达式中的空值�
null+<数字>=null(空值加数字仍是空值)�
null><数字>=null(空值与数字进行比较,结果仍是空值)�
null||'字符串'='字符串'(null即'')�
(空值与字符串进行连接运算,结果为原字符串)�

变量作用范围�
标识符在宣言它的块中有效�
标识符如果不在子块中重新定义,则在PL/SQL块的所有子块中同样有效�
重新定义后的标识符,作用范围仅在本子块中有效�

例�
declare�
e_mess�char(80);�
begin�
/*子块1*/�
declare�
v1�number(4);�
begin�
select�empno�into�v1�from�emp�
where�job='president';�
exception�
when�too_many_rows�then�
insert�into�job_errors�
values('more�than�one�president');�
end;�
/*子块2*/�
declare�
v1�number(4);�
begin�
select�empno�into�v1�from�emp�
where�job='manager';�
exception�
when�too_many_rows�then�
insert�into�job_errors�
values('more�than�one�manager');�
end;�
exception�
when�others�then�
e_mess:=substr(sqlerrm,1,80);�
insert�into�general�errors�values(e_mess);�
end;�

---------�
3�SQL和PL/SQL�

插入�
declare�
my_sal�number(7,2):=3040.55;�
my_ename�char(25):='wanda';�
my_hiredate�date:='08-SEP-88';�
begin�
insert�into�emp�
(empno,enmae,job,hiredate,sal,deptno)�
values(2741,my_ename,'cab�driver',my_hiredate,my_sal,20);�
end;�

删除�
declare�
bad_child_type�char(20):='naughty';�
begin�
delete�from�santas_gift_list�where�
kid_rating=bad_child_type;�
end;�

事务处理�
commit[WORK>;�
rollback[WORK>;�
(关键字WORK可选,但对命令执行无任何影响)�
savepoint�标记名;(保存当前点)�
在事务中标记当前点�
rollback�[WORK>�to�[SAVEPOINT>�标记名;(回退到当前保存点)�
取消savepoint命令之后的所有对数据库的修改�
关键字WORK和SAVEPOINT为可选项,对命令执行无任何影响�

函数�
PL/SQL块中可以使用SQL命令的所有函数�
insert�into�phonebook(lastname)�value(upper(my_lastname));�
select�avg(sal)�into�avg_sal�from�emp;�

对于非SQL命令,可使用大多数个体函数�
不能使用聚组函数和参数个数不定的函数,如�
x:=sqrt(y);�
lastname:=upper(lastname);�
age_diff:=months_between(birthday1,birthday2)/12;�

赋值时的数据类型转换�
4种赋值形式:�
变量名:=表达式�
insert�into�基表名�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';�
字符型转换成日期型�
insert�into�表名(num_col)�values('604badnumber');�
错误,无法成功地转换数据类型�

---------�
4�条件控制�
例�
declare�
num_jobs�number(4);�
begin�
select�count(*)�into�num_jobs�from�auditions�
where�actorid=&&actor_id�and�called_back='yes';�
if�num_jobs>100�then�
update�actor�set�actor_rating='word�class'�
where�actorid=&&actor_id;�
elsif�num_job=75�then�
update�actor�set�actor_rating='daytime�soaps'�
where�actorid=&&actor_id;�
else�
update�actor�set�actor_rating='waiter'�
where�actorid=&&actor_id;�
end�if;�
end�if;�
commit;�
end;�

--------�
5�循环�
语法�
loop�
......�
end�loop;�
exit;(退出循环)�
exit�[when>;(退出循环,当满足WHEN时)�
例1�
declare�
ctr�number(3):=0;�
begin�
loop�
insert�into�table1�values('tastes�great');�
insert�into�table2�values('less�filling');�
ctr:=ctr+1;�
exit�when�ctr=100;�
end�loop;�
end;�
(注:如果ctr取为NULL,循环无法结束)�

例2�
FOR语法�
for�变量<范围>�loop�
......�
end�loop;�

declare�
my_index�char(20):='fettucini�alfredo';�
bowl�char(20);�
begin�
for�my_index�in�reverse�21..30�loop�
insert�into�temp(coll)�values(my_index);�
/*循环次数从30到21*/�
end�loop;�
bowl:=my_index;�
end;�
跟在in�reverse后面的数字必须是从小到大的顺序,必须是整数,不能是变量或表达式�

----------�
6�游标�
显式游标�

打开游标�
open�<游标名>�
例�
open�color_cur;�

游标属性�
%notfound�
%found�
%rowcount�
%isopen�
例�
fetch�my_cur�into�my_var;�
while�my_cur�%found�loop�
(处理数据)�
fetch�my_cur�into�my_var;�
exit�when�my_cur�%rowcount=10;�
end�loop;�

%notfound属性�
取值情况如下:�
fetch操作没有返回记录,则取值为true�
fetch操作返回一条记录,则取值为false�
对游标无fetch操作时,取值为null�
<游标名>�%notfound�
例�
if�color_cur�%notfound�then...�
注:如果没有fetch操作,则<游标名>�%notfound将导致出错,�
因为%notfound的初始值为NULL。�

关闭游标�
close�<游标名>�
例�
close�color_cur;�

游标的FOR循环�
语法�
for�<记录名>�in�<游标名>�loop�
<一组命令>�
end�loop;�
其中:�
索引是建立在每条记录的值之上的�
记录名不必声明�
每个值对应的是记录名,列名�
初始化游标指打开游标�
活动集合中的记录自动完成FETCH操作�
退出循环,关闭游标�

隐式游标�
隐式游标是指SQL命令中用到的,没有明确定义的游标�
insert,update,delete,select语句中不必明确定义游标�
调用格式为SQL%�
存贮有关最新一条SQL命令的处理信息�

隐式游标的属性�
隐式游标有四个属性�
SQL%NOTFOUND�
SQL%FOUND�
SQL%ROWCOUNT:隐式游标包括的记录数�
例:�
delete�from�baseball_team�where�batting_avg<100;�
if�sql%rowcount>5�thn�
insert�into�temp�
values('your�team�needs�help');�
end�if;�

SQL%ISOPEN:取值总为FALSE。SQL命令执行完毕,PL/SQL立即关闭隐式游标。�

---------�
7�标号�
GOTO语句�
用法:�
goto�you_are_here;�
其中you_are_here是要跳转的语句标号�
标号必须在同一组命令,或是同一块中使用�

正确的使用�
<>(标号)�
x:=x+1�
if�a>b�then�
b:=b+c;�
goto�dinner;�
end�if;�

错误的使用�
goto�jail;�
if�a>b�then�
b:=b+c;�
<>(标号)�
x:=x+1;�
end�if;�

标号:解决意义模糊�
标号可用于定义列值的变量�
<>�
declare�
deptno�number:=20;�
begin�
update�emp�set�sal=sal*1.1�
where�deptno=sample.deptno;�
commit;�
end�sample;�
如果不用标号和标号限制符,这条命令将修改每条记录。�

----------�
8�异常处理�
预定义的异常情况�
任何ORACLE错误都将自动产生一个异常信息�
一些异常情况已命名,如:�
no_data_found�当SELECT语句无返回记录时产生�
too_many_rows�没有定义游标,而SELECT语句返回多条记录时产生�
whenever�notfound�无对应的记录�

用户定义的异常情况�
由用户自己获取�
在DECLARE部分定义:�
declare�
x�number;�
something_isnt_right�exception;�
用户定义的异常情况遵循一般的作用范围规则�
条件满足时,获取异常情况:raise�something_isnt_right�
注意:同样可以获取预定义的异常情况�

exception_init语句�
允许为ORACLE错误命名�

调用格式:�
pragma�exception_init(<表达式>,);�
例�
declare�
deadlock_detected�exception;�
pragma�exception_init(deadlock_detected,-60);�

raise语句�
单独使用RAISE命令,可再一次获取当前的异常情况(就象异常情况被重复处理了一样)。�
在异常处理中,此语句只能单独使用。�

异常处理标识符�
一组用于处理异常情况的语句:�
exception�
when�<表达式>�or�[表达式...>�then�
<一组语句>�
...�
when�others�then--最后一个处理�
<一组语句>�
end;既结束PL/SQL块部分,也结束异常处理部分�

--------�
练习与答案�
1:�
接收contract_no和item_no值,在inventory表中查找,如果产品:�
已发货,在arrival_date中赋值为今天后的7天�
已订货,在arrival_date中赋值为今天后的一个月�
既无订货又无发货,则在arrival_date中赋值为今天后的两个月,�
并在order表中增加一条新的订单记录。�

product_status的列值为'shipped'和'ordered'�

inventory:�
product_id�number(6)�
product_description�char(30)�
product_status�char(20)�
std_shipping_qty�number(3)�

contract_item:�
contract_no�number(12)�
item_no�number(6)�
arrival_date�date�

order:�
order_id�number(6)�
product_id�number(6)�
qty�number(3)�

答案:�
declare�
i_product_id�inventory.product_id%type;�
i_product_description�inventory.product_description%type;�
i_product_status�inventory.product_status%type;�
i_std_shipping_qty�inventory.std_shipping_qty%type;�

begin�
select�product_id,product_description,product_status,std_shipping_qty�
into�i_product_id,i_product_description,�
i_product_status,i_std_shipping_qty�
from�inventory�
where�product_id=(�
select�product_id�
from�contract_item�
where�contract_no=&&contractno�and�item_no=&&itemno);�
if�i_product_status='shipped'�then�
update�contract_item�
set�arrival_date=sysdate+7�
where�item_no=&&itemno�and�contract_no=&&contractno;�
elsif�i_product_status='ordered'�then�
update�contract_item�
set�arrival_date=add_months(sysdate,1)�
where�item_no=&&itemno�and�contract_no=&&contractno;�
else�
update�contract_item�
set�arrival_date=add_months(sysdate,2)�
where�item_no=&&itemno�and�contract_no=&&contractno;�
insert�into�orders�
values(100,i_product_id,i_std_shipping_qty);�
end�if;�
end�if;�
commit;�
end;�


2:�
1.找出指定部门中的所有雇员�
2.用带'&'的变量提示用户输入部门编号�
3.把雇员姓名及工资存入prnttable表中,基结构为:�
create�table�prnttable�
(seq�number(7),line�char(80));�
4.异常情况为,部门中奖金不为空值的雇员信息才能存入prnttable表中。�

答案:�
declare�
cursor�emp_cur�is�
select�ename,sal,comm�
from�emp�where�deptno=&dno;�
emp_rec�emp_cur%rowtype;�
null_commission�exception;�
begin�
open�emp_cur;�
fetch�emp_cur�into�emp_rec;�
while�(emp_cur%found)�loop�
if�emp_rec.comm�is�null�then�
begin�
close�emp_cur;�
raise�null_commission;�
end;�
end�if;�
fetch�emp_cur�into�emp_rec;�
end�loop;�
close�emp_sur;�
exception�
when�null_commission�then�
open�emp_cur;�
fetch�emp_cur�into�emp_rec;�
while�(emp_cur%found)�loop�
if�emp_rec.comm�is�not�null�then�
insert�into�temp�values(emp_rec.sal,emp_rec.ename);�
end�if;�
fetch�emp_cur�into�emp_rec;�
end�loop;�
close�emp_cur;�
commit;�
end;�



Java研究组织���-��版权所有�2002-2002��


RE:ORACLE数据库对象与用户管理(转)
作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]

ORACLE数据库对象与用户管理

一、ORACLE数据库的模式对象的管理与维护

本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。

1.1�表空间

由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。

创建表空间�
SQL>CREATE�TABLESPACE�jxzy

>DATAFILE�‘/usr/oracle/dbs/jxzy.dbf’

>ONLINE;

修改表空间�
SQL>ALTER�TABLESPACE�jxzy�OFFLINE�NORMAL;

SQL>ALTER�TABLESPACE�jxzy

>RENAME�DATAFILE�‘/usr/oracle/dbs/jxzy.dbf’

>TO�‘/usr/oracle/dbs/jxzynew.dbf’

>ONLINE

SQL>CREATE�TABLESPACE�jxzy�ONLINE

删除表空间�
SQL>DROP�TABLESPACE�jxzy

>INCLUDING�CONTENTS

1.�2�表维护

表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。

表的建立�
SQL>CREATE�TABLE�jxzy.switch(

>OFFICE_NUM�NUMBER(3,0)�NOT�NULL,

>SWITCH_CODE�NUMBER(8,0)�NOT�NULL,

>SWITCH_NAME�VARCHAR2(20)�NOT�NULL);

表的修改�
SQL>ALTER�TABLE�jxzy.switch

>ADD�(DESC�VARCHAR2(30));

表的删除�
SQL>DROP�TABLE�jxzy.switch

>CASCADE�CONSTRAINTS

//删除引用该表的其它表的完整性约束

1.�3�视图维护

视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。

视图的建立�
SQL>CREATE�VIEW�jxzy.pole_well_view�AS

>(SELECT�pole_path_num�AS�path,

pole�AS�device_num�FROM�pole

>UNION

>SELECT�pipe_path_num�AS�path,

>�well�AS�device_num�FROM�well);

视图的替换�
SQL>REPLACE�VIEW�jxzy.pole_well_view�AS

>(SELECT�pole_path_num�AS�path,

pole�AS�support_device�FROM�pole�
>UNION

>SELECT�pipe_path_num�AS�path,

well�AS�support_device�FROM�well);�
视图的删除�
SQL>DROP�VIEW�jxzy.pole_well_view;

1.4�序列维护

序列是由序列发生器生成的唯一的整数。

序列的建立�
SQL>CREATE�SEQUENCE�jxzy.sequence_cable

>START�WITH�1

>INCREMENT�BY�1

>NO_MAXVALUE;

建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval�返回当前值加1后的新值

序列的修改�
SQL>ALTER�SEQUENCE�jxzy.sequence_cable

>START�WITH�1�//起点不能修改,若修改,应先删除,然后重新定义

>INCTEMENT�BY�2

>MAXVALUE�1000;

序列的删除�
SQL>DROP�SEQUENCE�jxzy.sequence_cable

1.�5�索引维护

索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。

对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。

索引分唯一索引和非唯一索引

索引的建立�
SQL>CREATE�INDEX�jxzy.idx_switch

>ON�switch(switch_name)

>TABLESPACE�jxzy;

索引的修改�
SQL>ALTER�INDEX�jxzy.idx_switch

>ON�switch(office_num,switch_name)

>TABLESPACE�jxzy;

索引的删除�
SQL>DROP�INDEX�jxzy.idx_switch;

1.�6�完整性约束管理

数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。

完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.

a.�NOT�NULL�非空

b.�UNIQUE�唯一关键字

c.�PRIMATY�KEY�主键一个表只能有一个,非空

d.�FOREIGA�KEY�外键

e.CHECK�表的每一行对指定条件必须是true或未知(对于空值)

例如:

某列定义非空约束�
SQL>ALTER�TABLE�office_organization

>MODIFY(desc�VARCHAR2(20)

>CONSTRAINT�nn_desc�NOT�NULL)

某列定义唯一关键字�
SQL>ALTER�TABLE�office_organization

>MODIFY(office_name�VATCHAR2(20)

>CONSTRAINT�uq_officename�UNIQUE)

定义主键约束,主键要求非空�
SQL>CREATE�TABLE�switch(switch_code�NUMBER(8)

>CONSTRAINT�pk_switchcode�PRIMARY�KEY,)

使主键约束无效�
SQL>ALTER�TABLE�switch�DISABLE�PRIMARY�KEY

定义外键�
SQL>CREATE�TABLE�POLE(pole_code�NUMBER(8),

>office_num�number(3)

>CONSTRAINT�fk_officenum

>REFERENCES�office_organization(office_num)

>ON�DELETE�CASCADE);

定义检查�
SQL>CREATE�TABLE�office_organization(

>office_num�NUMBER(3),

>CONSTRAINT�check_officenum

>CHECK�(office_num�BETWEEN�10�AND�99);

二、ORACLE数据库用户与权限管理

ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。

2.�1�ORACLE数据库安全策略

建立系统级的安全保证�
系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。

建立对象级的安全保证�
对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。

建立用户级的安全保证�
用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。

2.2�用户管理

ORACLE用户管理的内容主要包括用户的建立、修改和删除

用户的建立�
SQL>CREATE�USER�jxzy

>IDENTIFIED�BY�jxzy_password

>DEFAULT�TABLESPACE�system

>QUATA�5M�ON�system;�//供用户使用的最大空间限额

用户的修改�
SQL>CREATE�USER�jxzy

>IDENTIFIED�BY�jxzy_pw

>QUATA�10M�ON�system;

删除用户及其所建对象�
SQL>DROP�USER�jxzy�CASCADE;�//同时删除其建立的实体

2.3系统特权管理与控制

ORACLE�提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。

授予系统特权�
SQL>GRANT�CREATE�USER,ALTER�USER,DROP�USER

>TO�jxzy_new

>WITH�ADMIN�OPTION;

回收系统特权�
SQL>REVOKE�CREATE�USER,ALTER�USER,DROP�USER

>FROM�jxzy_new

//但没有级联回收功能

显示已被授予的系统特权(某用户的系统级特权)�
SQL>SELECT*FROM�sys.dba_sys_privs

2.4�对象特权管理与控制

ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。

授予对象特权�
SQL>GRANT�SELECT,INSERT(office_num,office_name),

>UPDATE(desc)ON�office_organization

>TO�new_adminidtrator

>WITH�GRANT�OPTION;

//级联授权

SQL>GRANT�ALL�ON�office_organization

>TO�new_administrator

回收对象特权�
SQL>REVOKE�UPDATE�ON�office_orgaization

>FROM�new_administrator

//有级联回收功能

SQL>REVOKE�ALL�ON�office_organization

>FROM�new_administrator

显示已被授予的全部对象特权�
SQL>SELECT*FROM�sys.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>GRANT�DBA�TO�new_administractor

>WITH�GRANT�OPTION;

作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]

ORACLE数据库对象与用户管理

一、ORACLE数据库的模式对象的管理与维护

本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。

1.1�表空间

由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。

创建表空间�
SQL>CREATE�TABLESPACE�jxzy

>DATAFILE�‘/usr/oracle/dbs/jxzy.dbf’

>ONLINE;

修改表空间�
SQL>ALTER�TABLESPACE�jxzy�OFFLINE�NORMAL;

SQL>ALTER�TABLESPACE�jxzy

>RENAME�DATAFILE�‘/usr/oracle/dbs/jxzy.dbf’

>TO�‘/usr/oracle/dbs/jxzynew.dbf’

>ONLINE

SQL>CREATE�TABLESPACE�jxzy�ONLINE

删除表空间�
SQL>DROP�TABLESPACE�jxzy

>INCLUDING�CONTENTS

1.�2�表维护

表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。

表的建立�
SQL>CREATE�TABLE�jxzy.switch(

>OFFICE_NUM�NUMBER(3,0)�NOT�NULL,

>SWITCH_CODE�NUMBER(8,0)�NOT�NULL,

>SWITCH_NAME�VARCHAR2(20)�NOT�NULL);

表的修改�
SQL>ALTER�TABLE�jxzy.switch

>ADD�(DESC�VARCHAR2(30));

表的删除�
SQL>DROP�TABLE�jxzy.switch

>CASCADE�CONSTRAINTS

//删除引用该表的其它表的完整性约束

1.�3�视图维护

视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。

视图的建立�
SQL>CREATE�VIEW�jxzy.pole_well_view�AS

>(SELECT�pole_path_num�AS�path,

pole�AS�device_num�FROM�pole

>UNION

>SELECT�pipe_path_num�AS�path,

>�well�AS�device_num�FROM�well);

视图的替换�
SQL>REPLACE�VIEW�jxzy.pole_well_view�AS

>(SELECT�pole_path_num�AS�path,

pole�AS�support_device�FROM�pole�
>UNION

>SELECT�pipe_path_num�AS�path,

well�AS�support_device�FROM�well);�
视图的删除�
SQL>DROP�VIEW�jxzy.pole_well_view;

1.4�序列维护

序列是由序列发生器生成的唯一的整数。

序列的建立�
SQL>CREATE�SEQUENCE�jxzy.sequence_cable

>START�WITH�1

>INCREMENT�BY�1

>NO_MAXVALUE;

建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval�返回当前值加1后的新值

序列的修改�
SQL>ALTER�SEQUENCE�jxzy.sequence_cable

>START�WITH�1�//起点不能修改,若修改,应先删除,然后重新定义

>INCTEMENT�BY�2

>MAXVALUE�1000;

序列的删除�
SQL>DROP�SEQUENCE�jxzy.sequence_cable

1.�5�索引维护

索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。

对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。

索引分唯一索引和非唯一索引

索引的建立�
SQL>CREATE�INDEX�jxzy.idx_switch

>ON�switch(switch_name)

>TABLESPACE�jxzy;

索引的修改�
SQL>ALTER�INDEX�jxzy.idx_switch

>ON�switch(office_num,switch_name)

>TABLESPACE�jxzy;

索引的删除�
SQL>DROP�INDEX�jxzy.idx_switch;

1.�6�完整性约束管理

数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。

完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.

a.�NOT�NULL�非空

b.�UNIQUE�唯一关键字

c.�PRIMATY�KEY�主键一个表只能有一个,非空

d.�FOREIGA�KEY�外键

e.CHECK�表的每一行对指定条件必须是true或未知(对于空值)

例如:

某列定义非空约束�
SQL>ALTER�TABLE�office_organization

>MODIFY(desc�VARCHAR2(20)

>CONSTRAINT�nn_desc�NOT�NULL)

某列定义唯一关键字�
SQL>ALTER�TABLE�office_organization

>MODIFY(office_name�VATCHAR2(20)

>CONSTRAINT�uq_officename�UNIQUE)

定义主键约束,主键要求非空�
SQL>CREATE�TABLE�switch(switch_code�NUMBER(8)

>CONSTRAINT�pk_switchcode�PRIMARY�KEY,)

使主键约束无效�
SQL>ALTER�TABLE�switch�DISABLE�PRIMARY�KEY

定义外键�
SQL>CREATE�TABLE�POLE(pole_code�NUMBER(8),

>office_num�number(3)

>CONSTRAINT�fk_officenum

>REFERENCES�office_organization(office_num)

>ON�DELETE�CASCADE);

定义检查�
SQL>CREATE�TABLE�office_organization(

>office_num�NUMBER(3),

>CONSTRAINT�check_officenum

>CHECK�(office_num�BETWEEN�10�AND�99);

二、ORACLE数据库用户与权限管理

ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。

2.�1�ORACLE数据库安全策略

建立系统级的安全保证�
系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。

建立对象级的安全保证�
对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。

建立用户级的安全保证�
用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。

2.2�用户管理

ORACLE用户管理的内容主要包括用户的建立、修改和删除

用户的建立�
SQL>CREATE�USER�jxzy

>IDENTIFIED�BY�jxzy_password

>DEFAULT�TABLESPACE�system

>QUATA�5M�ON�system;�//供用户使用的最大空间限额

用户的修改�
SQL>CREATE�USER�jxzy

>IDENTIFIED�BY�jxzy_pw

>QUATA�10M�ON�system;

删除用户及其所建对象�
SQL>DROP�USER�jxzy�CASCADE;�//同时删除其建立的实体

2.3系统特权管理与控制

ORACLE�提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。

授予系统特权�
SQL>GRANT�CREATE�USER,ALTER�USER,DROP�USER

>TO�jxzy_new

>WITH�ADMIN�OPTION;

回收系统特权�
SQL>REVOKE�CREATE�USER,ALTER�USER,DROP�USER

>FROM�jxzy_new

//但没有级联回收功能

显示已被授予的系统特权(某用户的系统级特权)�
SQL>SELECT*FROM�sys.dba_sys_privs

2.4�对象特权管理与控制

ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。

授予对象特权�
SQL>GRANT�SELECT,INSERT(office_num,office_name),

>UPDATE(desc)ON�office_organization

>TO�new_adminidtrator

>WITH�GRANT�OPTION;

//级联授权

SQL>GRANT�ALL�ON�office_organization

>TO�new_administrator

回收对象特权�
SQL>REVOKE�UPDATE�ON�office_orgaization

>FROM�new_administrator

//有级联回收功能

SQL>REVOKE�ALL�ON�office_organization

>FROM�new_administrator

显示已被授予的全部对象特权�
SQL>SELECT*FROM�sys.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>GRANT�DBA�TO�new_administractor

>WITH�GRANT�OPTION;


原文地址:https://www.cnblogs.com/igubai/p/7426181.html