zoukankan      html  css  js  c++  java
  • 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
     
  • 相关阅读:
    The Balance POJ 2142 扩展欧几里得
    扩展欧几里得定理总结
    Crashing Robots POJ 2632 简单模拟
    POJ 1328 Radar Installation 贪心算法
    The Pilots Brothers' refrigerator DFS+枚举
    HDU RSA 扩展欧几里得
    HDU A/B 扩展欧几里得
    ACM 数学
    E
    BZOJ 3223: Tyvj 1729 文艺平衡树
  • 原文地址:https://www.cnblogs.com/HD/p/524081.html
Copyright © 2011-2022 走看看