ORACLEOUTLINE_第1页
ORACLEOUTLINE_第2页
ORACLEOUTLINE_第3页
ORACLEOUTLINE_第4页
ORACLEOUTLINE_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ORACLE体系结构数据文件主要文件数据文件(Data File)存储用户数据,组成表空间控制文件(Control File)记录了数据文件的信息重做日志文件(Redo Log File)记录数据库变化,循环使用辅助文件参数文件(Parameter File)存放Oracle初始化参数密码文件(Password File)存放特权用户口令归档日志文件(Achived Log File)非活动重做日志文件的备份内存SGA数据高速缓存(Data Buffer Cache)重做日志缓存(Redo Log Buffer)共享池(Shared Pool)库缓存(Library Cache)数据字典缓存(

2、Data Dictionary Cache)PGA后台进程必须的系统监护进程 SMON进程监护进程PMON检查点发起进程CKPT数据文件写进程DBW0重做日志文件写进程LGWR可选的ARC0语句处理查询(SELECT)解析(Parse)1.在库缓存中查找相同语句2.检查语法3.检查和锁住对象4.检查权限5.生成执行计划执行(Execute)提取数据(Fetch)DML(UPDATE,INSERT,DELETE)解析执行1.从数据文件中读取要修改的数据到数据高速缓存(如果没有已经在缓存中存在)2.在数据行上加锁3.将数据块和回滚块的变化记到重做日志缓存4.将旧数据,新数据分别写的数据高速缓存不同

3、的位置(并不一定写入到文件)COMMIT1.将提交和SCN号记到重做日志缓存2.调LGWR进程,将缓存内容写到重做日志文件3.提示用户提交完成4.释放事务所占锁ORACLE DBA数据库管理参数文件配置DB_NAME 数据库名称INSTANCE_NAME 实例名称CONTROL_FILES 控制文件列表DB_BLOCK_SIZE ORACLE数据块大小DB_BLOCK_BUFFER ORACLE数据块数目DB_CACHE_SIZE 数据高速缓存大小LOG_BUFFER 重做日志缓存大小SHARED_POOL_SIZE 共享池大小未列出的监听和客户端配置配置监听目标文件%oracle_home%

4、networkadminlistener.ora配置工具Net Manager(9i)Net8 Assistant(8i)监听程序控制工具LSNRCTLSTARTSTOPSTATUS配置客户端目标文件%oracle_home%networkadmintnsnames.ora配置工具Net Configuration Assistant数据库启动和关闭启动Windows在服务中启动STARTUPNOMOUNT只启动实例(内存和进程)MOUNT再打开控制文件OPEN缺省,打开数据文件FORCE关闭SHUTDOWNNORMAL缺省TRANSACTIONAL事务完成连接断开IMMEDIATE连接立即断

5、开,未提交事务回滚前三个不需要实例恢复ABORT上述命令数据字典视图普通视图ALL_USER_DBA_动态性能视图V$数据字典内容对象定义占用空间和已使用空间列信息约束信息用户信息表空间概念作用控制用户间配额降低I/O冲突方便备份和恢复以只读存储数据建立普通表空间临时表空间修改状态ONLINEOFFLINEREAD ONLYREAD WRITE删除DROP TABLESPACE 表空间名 INCLUDING CONTENTS CASCADE CONSTRAINTS用户概念是定义在数据库中的一个名称,是Oracle数据库的基本访问控制机制建立CREATE USER 用户名密码选项(Mand)ID

6、ENTIFIED BY 密码缺省表空间选项(Opt)DEFAULT TABLESPACE 缺省表空间名临时表空间选项(Opt)TEMPORARY TABLESPACE 临时表空间名表名间上的配额(Opt)QUOTA n/nK/nM ON 表空间名修改ALTER USER 用户名密码选项IDENTIFIED BY 密码缺省表空间选项DEFAULT TABLESPACE 缺省表空间名临时表空间选项TEMPORARY TABLESPACE 临时表空间名表名间上的配额QUOTA n/nK/nM ON 表空间名用户默认角色DEFAULT ROLE 默认角色删除无内容用户删除DROP USER 用户名有内

7、容用户删除DROP USER 用户名CASCADE显示信息缺省和临时表空间DBA_USERS表空间配额DBA_TS_QUOTAS段区块段区块权限系统权限常用系统权限CREATE SESSIONCREATE TABLECREATE VIEWCREATE PUBLIC SYNONYMCREATE SEQUENCECREATE PROCEDURECREATE TRIGGERCREATE CLUSTERCREATE TYPECREATE USERCREATE TABLESPACECREATE DATABASE LINK授予不允许再分配GRANT 系统权限名 to 用户名或角色名允许再分配GRANT 系

8、统权限名 to 用户名或角色名 WITH ADMIN OPTION收回REVOKE 系统权限名 FROM 用户名或角色名显示信息所有系统权限SYSTEM_PRIVILEGE_MAP用户的具有的系统权限DBA_SYS_PRIVS当前会话具有的系统权限SESSION_PRIVS对象权限对象权限ALTER(表,序列)DELETE(表,视图)EXECUTE(过程)INDEX(表)INSERT(表,视图)REFERENCES(表)SELECT(表,视图,序列)UPDATE(表,视图)授予不允许再分配GRANT 对象权限 ON 对象 TO 用户名或角色名允许再分配GRANT对象权限 ON 对象 TO 用户

9、名或角色名 WITH GRANT OPTION收回REVOKE 对象权限 ON 对象 FROM 用户名或角色名显示信息用户具有的对象权限DBA_TAB_PRIVS用户具有的列对象权限DBA_COL_PRIVS角色建立不验证CREATE ROLE 角色名称;CREATE ROLE 角色名称 NOT IDENTIFIED;数据库验证CREATE ROLE 角色名称 IDENTIFIED BY 密码;修改验证方式ALTER ROLE 角色名 IDENTIFIED BY 密码;ALTER ROLE 角色名 NOT IDENTIFIED;删除DROP ROLE 角色名分配角色GRANT 角色名称 TO

10、用户名或角色名称;激活和禁止角色指定用户的默认角色ALTER USER 用户名 DEFAULT ROLE ALL;ALTER USER 用户名 DEFAULT ROLE 角色名;ALTER USER 用户名 DEFAULT ROLE ALL EXCEPT 角色名;ALTER USER 用户名 DEFAULT ROLE NONE;激活角色SET ROLE 角色名SET ROLE 角色名 IDENTIFIED BY 密码禁止角色SET ROLE NONE显示信息角色具有的系统权限ROLE_SYS_PRIVS角色具有的对象权限ROLE_TAB_PRIVS用户具有的角色DBA_ROLE_PRIVS当前

11、会话激活的角色SESSION_ROLESORACLE SQLSQL语言基础特点非过程化类似自然语言只要说明做什么,无须说明怎么做一体化DBA用的数据库操作语句和DML,DDL,DCL都集成在SQL中两种使用方式联机交互方式程序嵌入方式元素常量文本型两边加单引号表示常量,比如'abc'这里容易犯的错误是把单引号写成全角的,或者写双引号(双引号表示对象名或字段名)在字符串内,两个单引号表示一个单引号,比如表示一个常量,内容是一个单引号数值型直接写的数字数据类型分类字符型CHARVARCHAR2LONG数值型NUMBERFLOAT日期型DATE二进制数据类型RAWLONG RAW大对

12、象数据类型BLOBCLOB比较规则字符串CHAR型和文本常量之间的比较,忽略空格,从左向右逐个字符比较VARCHAR2要比较空格,空格比任何字符都小单字节汉字按拼音比较对象略类型转换隐式只要能转成功好处:编程时不用考虑数值和字符型的区别显式转换函数TO_CHAR将日期或数值转换成字符串TO_NUMBER将字符串转换成数值TO_DATE将字符串转换为日期显示转换的好处提高语句可读性避免隐式转换可能带来的不确定性空值(NULL)目前空值等同于除连接运算(|)外,和空值计算结果都为空单行函数只有NVL和DECODE可以处理空值,返回非空结果(原来写了TRANSLATE,是书上说的,但试了不行)集合函

13、数只有COUNT(*)计算空值比较时一定要用IS NULL或IS NOT NULL,千万不能用=或!=伪列看似表的一列,但只能查询,不能插入,删除和修改CURRVAL序列的当前值,用法:序列名.CURRVAL必须先查询过一次NEXTVAL,才能使用CURRVALNEXTVAL序列的下一个值,用法:序列名.NEXTVALROWID包括数据行的对象号,文件号,块号和行号信息,是定位行的最快方法ROWNUM按行被检索出的顺序赋予的顺序递增号,从1开始不能查询ROWNUM大于某数值的数据使用ORDER BY有可能会保证不了ROWNUM的顺序ORACLE对象模式对象CLUSTERDATABASE LIN

14、KTRIGGERLIBRARYINDEXPACKAGESEQUENCEFUNCTIONPROCEDURESYNONYMTABLEVIEWSNAPSHOTSNAPSHOT LOG对象表对象类型对象视图非模式对象DIRECTORYPROFILEROLEROLLBACK SEGMENTTABLESPACEUSER命名一般对象130个字符,字母开头,大小写无关DATABASE LINK1128个字符数据库名8个字符命名空间模式对象不是所有模式对象都在同一命名空间下(不能重名)不和其它模式对象在一起的有:INDEX,CLUSTER,TRIGGER,DATABASE LINK非模式对象不是所有的非模式对象

15、都不在同一命名空间下(可以重名)用户和角色属于同一个命名空间注释/* */和-运算符算术运算符+ - * /和正负号(+-)连接运算符|或concat()比较运算符=、!=(<>)、>、>=、<、<=in、any、some、all、between and、exists、is (not) null、likeand、or、notunion、union all、intersect、minus(+)函数单行函数数值型函数三角函数sin、cos、tan、asin、acos、atan、atan2、sinh、cosh、tanhabs(n)绝对值ceil(n)取天棚,大于或

16、等于n的最小整数ceil(15.7) :16ceil(-15.7) :-15floor(n)取地板,小于或等于n的最大整数floor(15.7) :15floor(-15.7) :-16round(n,m)取整(被取整的数,小数位数)m的缺省值是0m可以是负数,表示从小数点往前数trunc(n,m)截断(被截断的数,小数位数)m的缺省值是0m可以是负数,表示从小数点往前数sign(n)将正负号转化为数值:n为正数返回1,为负数返回-1,为0返回0mod(m,n)m/n的余数正负数无关只与m有关,与n无关power(m,n)m的n次方sqrt(n)n的平方根相当于power(m,0.5)ln(n

17、)log(m,n)exp(n)字符型函数concat(s1,s2)substr(s,m,n)取子字符串(原字符串,开始位置,子串长度)如果n省略,一直取到s结尾m是负数表示从尾部倒着数返回字符串lower(s)小写length(s)字符串长度upper(s)大写chr(n)得到字符,n是Ascii码ascii(c)得到Ascii码,c是字串initcap(s)lpad(s1,n,s2)左填充(原字符串,填充后字符串长度,填充字符)s2省略时是空格把填充字符填在原字符串左侧rpad(s1,n,s2)右填充(原字符串,填充后字符串长度,填充字符)s2省略时是空格把填充字符填在原字符串右侧ltrim

18、(s,set)左修整(原字符串,移除字符集)set为空,移除空格操作方法是从左侧依次看每个字符,如果在set里就移除,如果不在,停止操作rtrim(s,set)右修整(原字符串,移除字符集)set为空,移除空格操作方法是从右侧依次看每个字符,如果在set里就移除,如果不在,停止操作replace(s1,s2,s3)替换(原字符串,查找的子串(原串中的连续子串),替换成的串)在s1中找所有的s2,换成s3当s3为空或省略这个参数时,删除s1中的s2translate(s,from,to)转换(原字符串,查找的字符集,替换成的字符集)将s中在from集合中出现的字符,替换成to中相应的字符from

19、和to长度应该相同instr(s1,s2,n,m)查找(被查找的串,查找的子串,查找位置,出现次数)返回在s1中,从n开始查找s2出现m次的位置n是负数时,从尾部倒数,并且反向查找返回的是位置.n,m default is 1 日期函数sysdate返回当前系统时间,没有参数add_months(d,n)增加月份(增加前的时间,增加月数)n可以为负数last_day(d)当月最后一天(某个时间)返回d所处月份的最后一天months_between(d1,d2)两日期之间的月份数(第一个日期,第二个日期)得到的数字可能是负数,也可能是小数可以认为是第一个日期减去第二个日期,以判断结果正负next

20、_day(d,s)下一个星期几(原日期,星期几)返回d下一个s(必须是星期几)所处的日期round(d,fmt)取整(原日期,精确到的日期格式)fmt省略时,精确到天trunc(d,fmt)截断(原日期,精确到的日期格式)fmt省略时,精确到天类型转换函数to_char转换为字符串(数值,格式)转换成字符串(日期,格式)to_date转换成日期(字符串,格式)to_number转换成数字(字符串,格式)其它单行函数greatest(exp1,exp2,)最大值, exp任何类型,exp混合类型,least(exp1,exp2,)最小值nvl(exp1,exp2)当exp1为NULL时返回exp

21、2,否则返回exp1uid当前用户标识user当前用户名userenv当前会话信息ISDBALANGUAGETERMINALINSTANCEDecode( a,|b,c|,d,e|,f)If a= b then return c else if a=d then return eElse returne f组函数 忽略null 值avg平均值count计数max最大值min最小值sum和variance方差stddev标准差基本SQL语句DDLDMLINSERT INTOinsert into emp(ename,empno) values(TEST,9999);insert into emp

22、 values();insert into emp select * from emp;UPDATEupdate emp set ename = TEST,empno = 8888 where empno = 9999;DELETE FROMdelete from emp where empno = 9999;delete emp where empno = 9999;SELECTSELECT后接字段列表FROM后接所有涉及表WHERE后接关联条件(避免迪卡尔积)和其它过滤条件GROUP BY后接分组条件(只能是表达式,不能用别名,分组时,SELECT列表中的内容要么是分组函数,要么出现在gr

23、oup by子句中)HAVING后接分组后的过滤条件(只能用分组函数或group by子句后面的表达式,不能用别名)ORDER BY后接排序表达式,可以用SELECT列表中的别名例求emp表中各部门工资大于2000的员工的平均工资,只要求查看平均工资大于5000的部门,并按平均工资倒序排序,平均工资相同的,按部门号排序select deptno,avg(sal) salfrom empwhere sal > 2000group by deptnohaving avg(sal) > 5000order by sal desc,deptno查询集合操作UNION ALL两查询的结果集合

24、并集,加上ALL选项将保留重复记录INTERSECT两查询的结果集合交集MINUS一查询的结果集合与另一查询的结果集合差集SQL*PLUSn直接打数字,将切换当前行到第n行,并显示该行内容用在随后使用append,change,input命令的场合,或者做成存储过程后出错进行调试LIST显示缓冲区内容l m n 从m行显示到n行(m,n是数字)l last 显示最后一行l * 显示当前行l 显示全部行APPEND在缓冲区当前行尾添加内容a text要添加一个空格,在a后面写两个空格(前一个是命令格式,后一个是要添加的空格)要添加一个分号(;),在a后面写两个分号(前一个是要添加的分号,后一个是

25、命令格式)CHANGE修改缓冲区当前行的内容c/old/new 当前行中找到第一个old换成newc/old 不指定new,删除第一个找到的old可以用.来代替一系列字符串INPUT在缓冲区当前行后新增加行i 直接回车,会提示你一直添加,直到连续两次回车或在行首输入.回车结束添加i text 在当前行后添加一行内容为text就结束添加DEL删除行del 删除当前行del * 删除当前行(同del)del n 删除第n行del m n 删除m到n行del last 删除最后一行CLEAR BUFFER清除缓冲区内容SAVE(含有REPLACE选项)保存缓冲区内容到文件sav file 保存缓冲内

26、容到文件(目录和文件名由file指定)sav file rep 保存缓冲内容到文件,如果已经存在则覆盖(不指定rep,文件存在时会出错)EDIT调用SQL*PLUS指定编辑器(_EDITOR)编辑当前缓冲区或者指定的外部文件ed 编辑当前缓冲区内容(AFIEDT.BUF)ed file 编辑外部文件,由file指定目录和文件名SPOOL假脱机(保存屏幕输出到文件)spo 查看当前假脱机状态spo file 开始将屏幕的输出保存到文件,目录和文件名由file指定spo off 结束当前假脱机,注意没有spo on这种命令,另外如果不spo off,就无法保证file中有内容START()执行外部

27、的文件中的内容(SQL*PLUS命令或SQL语句)sta等同于sta file 调入file中的内容到缓冲区并执行(file指定了目录名和文件名)用时不用加空格:file还有命令,表示被调用的文件和发起调用的文件在同一目录下(不写目录名的情况)SETSET命令有如下常用选项ECHOstart命令是否执行前显示文件中的内容set echo on 显示set echo off 不显示(缺省值)FEEDBACK超过几行显示SELECT返回的行数set feed n 超过n行显示(缺省值是6)set feed 0 不显示set feed off 不显示(等同于set feed 0)set feed 1

28、 超过1行就显示set feed on 超过1行就显示(等同于set feed 1)LINESIZESQL*PLUS每行显示最大字符数set lin n 最大显示n个字符(缺省值是80)NUMWIDTH设置数字显示的缺省长度set num n 显示长度设为n个字符长(缺省值是10)PAGESIZE设置SQL*PLUS每一页的行数(换新页时要重新加标题并空行)set pages n 设置为n行(缺省值是14)PAUSESELECT返回记录进行输出时,每次换页之前是否进行暂停(回车继续)set pau on 设置为暂停set pau off 不暂停(缺省值)SERVEROUTPUT是否显示PL/S

29、QL的屏幕输出(DBMS_OUTPUT.PUT_LINE)set serverout on 显示set serverout off 不显示(缺省值)TIME是否显示当前数据库时间set ti on 显示当前时间set ti off 不显示(缺省值)TIMING是否显示每次SQL命令或PL/SQL代码执行的时间set timi on 显示set timi off 不显示(缺省值)VERIFY是否在替换define变量后将替换结果再显示一遍set ver on 显示替换后得到命令(缺省值)set ver off 不显示WRAP控制当前行超过最大行长度后是折行还是截断set wra on 折行(缺省

30、值)set wra off 截断SHOW可后接所有set命令的选项,查看该选项的设置状态get file将文件读入缓存区run执行缓存区中的sql语句,并打印sql语句ORACLE对象视图不真正包含数据,只是一个语句create or replace view 视图名 as select 后接select语句序列语法create sequence 序列名可用的选项start with开始值increment by增量minvalue最小值maxvalue最大值cache n/nocache一次取到缓冲中的序列值个数cycle/nocycle序列到达最大值后是否从最小值重新开始order/noo

31、rder用在OPS系统中,保证双机按顺序产生序列值例create sequence seq_teststart with 150 increment by 10 minvalue 100 maxvalue 200 cache 2 cycle;产生的值为150,160,170,180,190,200,100,110访问序列值nextval伪列通过序列.nextval来访问序列的下一个值select seq_test.nextval from dual;insert into test values(seq_test.nextval);update test set a = seq_test.ne

32、xtval where a = xx;currval伪列通过序列.currval来访问序列的当前值,但是每个会话中必须先访问一次nextval才能访问currvalPL/SQL存储过程语法-(红字部分表示数据类型不能写长度的地方!)create or replace procedure 过程名(a emp.ename%type,b varchar2,) as -注释 v emp.ename%type;/*注释*/begin -判断 if then ; elsif then ; else ; end if; -for循环 for i in 1.5 loop ; end loop; -while循

33、环 while loop ; end loop; -loop循环 loop ; -退出循环 exit when ; -退出过程 return; end loop; commit; rollback;exception when NO_DATA_FOUND then ; when TOO_MANY_ROWS then ; when OTHERS thenend;/例子-本例子演示打印一个输入数字的从1到10倍的值create or replace procedure printval(n number)asbegin for i in 1 . 10 loop dbms_output.put_li

34、ne(i); end loop;end;调用在sqlplus中打execute 存储过程名(参数)或者begin 存储过程名(参数); end;/存储函数语法-(红字部分表示数据类型不能写长度的地方!)create or replace function 函数名(参数列表)return 数据类型asbegin return ;end;/例子-本例演示调用象其它Oracle系统单行函数一样调用(用户不能自定义组函数)触发器语法create or replace trigger 触发器名before|after|instead of 事件insert,update,delete,create,al

35、ter,drop,startup,shutdown,logon,logoff,servererroron 表或视图名|databasefor each row when 条件declare ;begin ;end;/例子状态切换可以控制触发器启动或失效通过触发器alter trigger 触发器名 enable;alter trigger 触发器名 disable;通过表alter table 表名 enable all triggers;alter table 表名 disable all triggers;只有视图上的DML触发器可以是INSTEAD OF触发器,只有表上的DML触发器可以

36、是BEFORE或AFTER触发器信息查看user_triggers视图中的trigger_body中记录了触发器的定义包语法create or replace package 包名as procedure p(); function f();end;-create or replace package body 包名as -过程和函数可以重载 procedure p() as begin end; function f() return as begin end;end;调用无非是指调用它的过程和函数在SQL*PLUS中执行exec 包.过程名(参数)包.函数名(参数)可以和其它单行函数一样使

37、用包中的变量可以直接引用,没有公共和私有的概念记录记录就象C语言里的结构体,列结构和表一样,但是只能容纳一条数据,如果说一个学生表里可以存多个学生的信息,那记录中只能放一个学生的信息语法-先定义记录类型type 记录类型名 is record( 变量名 类型 :=|default 初值, 变量名 类型 :=|default 初值, );-再定义记录变量记录变量名 记录类型名;因为记录和表的列结构相同,所以可以直接引用表的结构来定义记录变量: 记录变量名 表名%rowtype;例子declare -随便定义一个记录类型 type t1 is record( a number(3), b varc

38、har2(10) := 'abc' ); -定义此类型的变量 r1 t1; -通过表也可以直接定义记录变量 r2 emp%rowtype; s varchar2(10);begin -记录变量中的元素可写 r1.a := 10; -也可读 s := r1.b; -可以这样直接读入一整行 select * into r2 from emp where empno = '6300' -打印一个结果 dbms_output.put_line(r2.ename);end;/游标隐式在PL/SQL中出现的SELECT语句,DML语句都是隐式的游标不能对隐式的游标进行打开关

39、闭等操作,只能读它的状态读属性用sql关键字来代表刚刚执行过的SELECT或DML语句sql%isopen 游标是否打开(永远是false,因为语句执行完游标自动关闭)sql%found 是否有影响的行sql%notfound 和sql%found的值相反sql%rowcount 影响的行数显式语法定义cursor 游标名 isselect 后接SELECT语句;打开open 游标名;取数据fetch 游标名 into 记录变量|普通变量列表(逗号分隔);关闭close 游标名;读属性游标名%isopen 游标是否打开游标名%found fetch操作有没有取到值(先fetch再判断)游标名%

40、notfound 和%found相反游标名%rowcount 游标中的数据行数(注意不是全部行数,而是fetch到一次就加一)例子-本例演示打印所有emp表中雇员名称declare cursor c1 is select ename from emp; rec c1%rowtype;begin open c1; loop fetch c1 into rec; exit when c1%notfound; dbms_output.put_line(rec.ename); end loop; close c1;end;/-上面的代码是用loop做循环,也可以用while loopdeclare c

41、ursor c1 is select ename from emp; rec c1%rowtype;begin open c1; fetch c1 into rec; while c1%found loop dbms_output.put_line(rec.ename); fetch c1 into rec; end loop; close c1;end;/-但是这样要先在循环外fetch一次,好象更麻烦带参数的游标可以为游标加参数,使用起来更灵活语法-(红字部分表示数据类型不能写长度的地方!)declare cursor 游标名(参数名 数据类型 :=|default 缺省值,参数名) is

42、 select 后接SELECT语句;begin-打开的时候要把参数传进去 open 游标名(参数值,参数值);-取数据和关闭同普通游标 fetch 游标名 into 记录变量|普通变量列表(逗号分隔); close 游标名;end;例子-打印某部门全部员工姓名,部门号通过参数传递declare cursor c1(d emp.deptno%type) is select ename from emp where deptno = d; name emp.ename%type;begin open c1('10'); loop fetch c1 into name; exit

43、when c1%notfound; dbms_output.put_line(name); end loop;end;/补充内容SQLPLUS部分结合变量把SQLPLUS看做应用程序,结合变量就是应用程序的变量定义在SQLPLUS中, variable 结合变量名 类型;例如: var s number(2);显示信息在SQLPLUS中, variable 结合变量名可以查看结合变量是否被定义在SQLPLUS中, print 结合变量名可以查看结合变量的值在PL/SQL中使用在PL/SQL中使用结合变量时用冒号加上结合变量名普通的SQL语句中不能使用结合变量例子:var s numberbeg

44、in :s := 20;end;/print s;可以看到s的值已经成为20PL/SQL部分自定义异常语法自定义异常名 exception;例子-下面的例子演示了一个计算除法的函数,除了普通除法的要求(除数不能为0),还要求除数必须是整数,否则会给出错误提示。create or replace function mydiv(a number,b number)return charas DECIMAL_DIVIDE exception; -这里DECIMAL_DIVIDE是自己起名字自定义的异常begin if b <> round(b) then raise DECIMAL_DI

45、VIDE; end if; return a/b;exception when ZERO_DIVIDE then return 'DIVISOR CANNOT BE ZERO' when DECIMAL_DIVIDE then return 'DIVISOR CANNOT BE DECIMAL'end;请试着运行下面的语句select mydiv(10,5) from dual;select mydiv(10,0) from dual;select mydiv(10,1.5) from dual;这样就把错误处理全都放到了一起,有利于保证主程序逻辑的清晰性GOT

46、O语句和标签GOTO语句用于在语句中跳转,必须和标签一起使用。但对于标签,除了和GOTO语句配合,还可以用在exit语句中。语法定义标签:<<标签名>>,注意标签名必须用字母开头,后面可以接数字,但不能以数字开头GOTO语句:goto 标签名;GOTO和标签的例子下面的例子演示的是GOTO语句和标签共同使用,改变正常程序流程begin goto lb2; <<lb1>> dbms_output.put_line('line 1'); return; <<lb2>> dbms_output.put_line(

47、'line 2'); goto lb1;end;/显示结果为line 2line 1标签和exit的例子-未使用标签时begin -注意i,j不需要定义,当然定义了也不算错 for i in 1.3 loop for j in 1.3 loop exit when j = 2; -这时跳出的是里层循环 dbms_output.put_line(i | ':' | j); end loop; end loop;end;显示的结果为1:12:13:1-使用标签时begin <<lb1>> for i in 1.3 loop for j in

48、1.3 loop exit lb1 when j = 2; -这时跳出的是外层循环 dbms_output.put_line(i | ':' | j); end loop; end loop;end;显示的结果为1:1过程和函数的参数过程或函数的参数列表中的参数定义是如下格式: 变量名 in|out|in out 类型 :=|default 缺省值缺省的情况,变量是in的,可以省略当参数是out或in out的时候,该参数必须是变量当是in参数时,值不能传出去,当是out时,值不能传进来,当是in out时才可以既传进又传出out或in out型的参数在SQLPLUS中可以用结合变量有缺省值的参数可以不传值,但是调用过程或函数时的参数不能只用逗号来顶位置,而不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论