OraclePL/SQL编程手册一、SQLPLUS1引言SQL命令以下17个是作为语句开头的关键字:alterdroprevokeauditgrantrollback*commit*insertselectcommentlockupdatecreatenoauditvalidatedeleterename这些命令必须以“;”结尾带*命令句尾不必加分号,并且不存入SQL缓存区。SQL中没有的SQL*PLUS命令这些命令不存入SQL缓存区@definepause#delquit$describeremark/disconnectrunacceptdocumentsaveappendeditsetbreakexitshowbtitlegetspoolchangehelpsqlplusclearhoststartcolumninputtimingcomputelistttitleconnectnewpageundefinecopy---------2数据库查询数据字典TAB用户创建的所有基表、视图和同义词清单DTAB构成数据字典的所有表COL用户创建的基表的所有列定义的清单CATALOG用户可存取的所有基表清单select*fromtab;describe命令描述基表的结构信息describedeptselect*fromemp;selectempno,ename,jobfromemp;select*fromdeptorderbydeptnodesc;逻辑运算符=!=或==inbetweenvalue1andvalue2like%_innullnotnoin,isnotnull谓词in和notin有哪些职员和分析员selectename,jobfromempwherejobin('clerk','analyst');selectename,jobfromempwherejobnotin('clerk','analyst');谓词between和notbetween哪些雇员的工资在2000和3000之间selectename,job,salfromempwheresalbetween2000and3000;selectename,job,salfromempwheresalnotbetween2000and3000;谓词like,notlikeselectename,deptnofromempwhereenamelike'S%';(以字母S开头)selectename,deptnofromempwhereenamelike'%K';(以K结尾)selectename,deptnofromempwhereenamelike'W___';(以W开头,后面仅有三个字母)selectename,jobfromempwherejobnotlike'sales%';(哪些雇员的工种名不以sales开头)谓词isnull,isnotnull没有奖金的雇员(即commision为null)selectename,jobfromempwherecommisnull;selectename,jobfromempwherecommisnotnull;多条件查询selectename,jobfromempwheredeptno=20andjob!='clerk';表达式+-*/算术表达式选择奖金高于其工资的5%的雇员selectename,sal,comm,comm/salfromempwherecomm.05*salorderbycomm/saldesc;日期型数据的运算addtwodaysto6-Mar-876-Mar-87+2=8-Mar-87addtwohoursto6-Mar-876-Mar-87+2/24=6-Mar-87and2hrsadd15secondsto6-Mar-876-Mar-87+15/(24*60*60)=6-Mar-87and15secs列名的别名selectenameemployeefromempwheredeptno=10;(别名:employee)selectename,sal,comm,comm/salC/SRATIOfromempwherecomm.05*salorderbycomm/saldesc;SQL命令的编辑listorl显示缓冲区的内容list4显示当前SQL命令的第4行,并把第4行作为当前行,在该行号后面有个*。changeorc用新的内容替换原来在一行中第一次出现内容SQLc/(...)/('analyst')/inputori增加一行或多行appendora在一行后追加内容del删除当前行删除SQL缓冲区中的当前行run显示并运行SQL缓冲区中的命令/运行SQL缓冲区中的命令edit把SQL缓冲区中的命令写到操作系统下的文本文件,并调用操作系统提供的编辑器执行修改。-------------3数据操纵数据的插入insertintodeptvalues(10,'accounting','newyork');insertintodept(dname,deptno)values('accounting',10);从其它表中选择插入数据insertintoemp(empno,ename,deptno)selectid,name,departmentfromold_empwheredepartmentin(10,20,30,40);使用参数insertintodeptvalues(&deptno,&dname,&loc);执行时,SQL/PLUS对每个参数将有提示用户输入参数对应日期型或字符型数据时,可在参数上加引号,输入时就可不用引号insertintodeptvalues(&deptno,'&dname','&loc');插入空值(NULL)insertintodeptvalues(50,'education',null);插入日期型数据日期型数据缺省格式:DD-MON-YYinsertintoemp(empno,ename,hiredate)values(7963,'stone','07-APR-87');系统时间:SYSDATEinsertintoemp(empno,ename,hiredate)values(7600,'kohn',SYSDATE);数据更新updateempsetjob='manager'whereename='martin';updateempsetjob='marketrep'whereename='salesman';updateempsetdeptno=40,job='marketrep'wherejob='salesman';数据删除deleteempwhereempno=765;更新的提交commit自动提交方式setautocommiton如果状态设为开,则使用inesrt,update,delete会立即提交。更新取消rollback两次连续成功的commit之间的操作,称为一个事务---------------4创建基表、视图创建基表createtabledept(deptnonumber(2),dnamechar(14),locchar(13));数据字典会自动更新。一个基表最多254列。表名列名命名规则:限制第一个字符必须是字母,后面可任意(包括$#_但不能是逗号)。名字不得超过30个字符。唯一某一用户的基表名必须唯一,不能是ORACLE的保留字,同一基表的列名互不相同。使用双引号如果表名用双引号括起来,则可不满足上述规则;只有使用双引号,才能区别大、小写;命名时使用了双引号,在以后的操作也必须使用双引号。数据类型:char(n)(不得超过240字符)number(n,d)datelong(最多65536字符)raw(二进制原始数据)空值处理有时要求列值不能为空createtabledept(deptnonumber(2)notnull,dnamechar(14),locchar(13));在基表中增加一列altertabledeptadd(headcntnumber(3));修改已有列属性altertabledeptmodifydnamechar(20);注:只有当某列所有值都为空时,才能减小其列值宽度。只有当某列所有值都为空时,才能改变其列值类型。只有当某列所有值都为不空时,才能定义该列为notnull。例:altertabledeptmodify(locchar(12));altertabledeptmodifylocchar(12);altertabledeptmodify(dnamechar(13),locchar(12));创建视图createviewmanagersasselectename,job,salfromempwherejob='manager';为视图列名取别名createviewmydept(person,title,salary)asselectename,job,salfromempwheredeptno=10;withcheckoption选项使用withcheckoption,保证当对视图插入或更新数据时,该数据必须满足视图定义中select命令所指定的条件。createviewdept20asselectename,job,sal,deptnofromempwheredeptno=20withcheckoption;在做下述操作时,会发生错误updatedept20setdeptno=30whereename='ward';基表、视图的拷贝createtableemp2asselect*fromemp;基表、视图的删除droptable表名dropview视图名------------5SQL*PLUS报表功能SQL*PLUS的一些基本格式命令columndeptnoheadingdepartmentcolumnenameheadingnamecolumnsalheadingsalarycolumnsalformat$99,999.00ttitlesamplereportfor|hitechcorpbtitlestrictlyconfidentialbreakondeptnocomputesumofsalondeptnorun表头和表尾ttitlesamplereportfor|hitechcorpbtitlerightstrictlyconfidential“|”表示换行,结尾不必加分号选项有三种:leftrightcenter使用TTITLE,系统将自动地在每页的顶部显示日期和页号。TTITLET和BTITLE命令有效,直至重新设置表头或表尾,或退出SQL*PLUS。下面命令使标题语句失效TTITLEOFFBTITLEOFF列名column命令定义用于显示列名若名字为一个单词,不必加引号columnenameheadingemployeecolumnenameheading'employee|name'(|为换行)取消栏定义columnenameclear列的格式columnenameformatA15columnsalformat$9,999.99columncommlikesallike子句,使得某一列的格式参照另一列格式,它拷贝列名及其格式控制记录显示分组顺序breakondeptno(不显示重复值)selectdeptno,enamefromemporderbydeptno;(ORDERBY子句用于控制BREAK)显示为10clarkniller20smithscott30allenblake每次只有一个BREAK命令起作用,但一次可以在多个列上使用BREAK命令breakon列名1on列名2记录分组breakondeptnoskip2selectdeptno,enamefromemporderbydeptno;每个deptno之间空两行clearbreak(取消BREAK命令)