第5章-Oracle PL SQL语言及编程包、触发器、同义词、序列_第1页
第5章-Oracle PL SQL语言及编程包、触发器、同义词、序列_第2页
第5章-Oracle PL SQL语言及编程包、触发器、同义词、序列_第3页
第5章-Oracle PL SQL语言及编程包、触发器、同义词、序列_第4页
第5章-Oracle PL SQL语言及编程包、触发器、同义词、序列_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第5章OraclePL/SQL语言及编程本章学习导航Oracle11g安装与配置数据库技术基础回顾数据库备份与恢复数据库应用程序开发闪回技术数据库存储管理数据库操作数据表操作查询操作视图和索引操作PL/SQL编程基础高级管理基本管理数据库设计数据库管理数据库应用数据库安全管理本章学习要点(1)PL/SQL的程序结构(2)PL/SQL的字符集、标识符(3)

数据类型、常量和变量(4)结构控制语句

(5)游标的概念和使用(6)过程的创建、调用和删除

(7)函数的创建、调用和删除

(8)包、触发器、同义词、序列的创建和使用计划课时:10+4课时5.5包(Package)包可以将逻辑相关的PL/SQL块或元素(变量、常量、自定义数据类型、异常、过程、函数)等组织在一起,构成一个完整的单元存储在数据库中。通过这种方式,可以构建其他编程人员重用的代码库。Oracle数据库提供了包库,可以用来访问外部文件、管理数据库、生成HTML,等。要查看所有的包,可查阅Oracle公司出版的《OracleDatabasePL/SQLPackagesandTypeReference》5.5.1包的组成包由包说明(也称:包规范)和包体两部分,分开存储在数据字典里。包说明相当于一个包的头部,它对包的所有部件进行简单声明,具有包访问权限的用户才能访问它们。包说明中通常不包括过程或函数的代码,包体中才包含实际的代码。5.5.2创建包分两个步骤:创建包说明创建包体1.创建包说明CREATE[ORREPLACE]PACKAGE包名IS|AS变量、常量及数据类型定义;过程说明|函数说明|异常说明END[包名];创建包说明举例1CREATEORREPLACEPACKAGEEXPPASPROCEDUREPR(XXNUMBER);--仅有名字和参数FUNCTIONFNRETURNVARCHAR2;VAR1NUMBER;VAR2VARCHAR2(30);VAR3BOOLEAN;ENDEXPP;包头中只说明过程或函数名及其参数。创建包说明举例2CREATEORREPLACEPACKAGEmy_packageISpersonNumNUMBER;TYPEem_curISREFCURSOR;--声明游标是一种引用类型

FUNCTIONf_count_num(in_deptnoinemp.deptno%TYPE)RETURNNUMBER;--声明函数PROCEDUREp_count_num(in_dnoinemp.deptno%TYPE,out_numoutNUMBER);--声明过程ENDmy_package;创建包说明的注意事项要在包中建立的过程等必须先在包说明部分说明。包部件可以任意次序,但必须使用之前说明。在包说明中只说明过程和函数的名称及参数,包的代码在包体中。包中可能只有一种类型部件,如过程或函数等。包说明中定义的变量在包体可以使用。包体的名称必须与包说明的包名一样。可以在包说明外为包变量赋值:EX.VAR1:=0;查询用户创建的包查询当前用户创建的包:SELECTDISTINCTname,typeFROMuser_sourceWHEREtype=‘PACKAGE’;创建包体2.创建包体:CREATEORREPLACEPACKAGEBODY包名

ASPROCEDURE…--过程的实际代码FUNCTION…--函数的实际代码END[包名];查询包中的过程和函数:SELECTobject_name,procedure_nameFROMuser_procedureswhereobject_name=‘MY_PACKAGE1’;必须与建包的包名一致!建立包体举例1CREATEORREPLACEPACKAGEBODYexppASPROCEDUREpr(xxNUMBER)ASBEGINvar1:=xx;ENDpr;FUNCTIONfnRETURNVARCHAR2ASBEGINvar2:='TAXES';RETURNVAR2||''||to_char(var1);ENDfn;ENDexpp;建立包体举例2CREATEORREPLACEPACKAGEBODYmy_packageISCURSORemp_curISSELECTempno,ename,sal,deptnoFROMempWHEREsal>2000;FUNCTIONf_count_num(in_deptnoinemp.deptno%TYPE)RETURNNUMBERASout_numNUMBER;BEGINSELECTcount(empno)INTOout_numFROMempWHEREdeptno=in_deptno;RETURNout_num;ENDf_count_num;PROCEDUREp_count_num(in_dnoinemp.deptno%TYPE,out_numoutNUMBER)ASBEGINSELECTcount(empno)INTOout_numFROMempWHEREdeptno=in_dno;ENDp_count_num;ENDmy_package;5.5.3包的使用包中过程或函数调用:包名.过程名或函数名[(实参表)]例如:对包expp的部件进行调用:BEGIN

expp.VAR3:=TRUE;--在包外为包内变量赋值

expp.pr(2);DBMS_OUTPUT.PUT_LINE(expp.fn);END;包的使用示例DECLAREnumNUMBER;BEGINmy_package1.p_count_num(20,num);DBMS_OUTPUT.PUT_LINE(num);END;5.5.4包的其他操作删除包

语法:

DROPPACKAGE包名;说明:删除包时,包说明及包体全部删除。

删除包体

DROPPACKAGEBODY包名;说明:该语句一旦执行,仅删除包体.删除包体和删除包举例例:DROPPACKAGEBODYEXPP;SELECTNAMEFROMUSER_SOURCEWHERETYPE=‘PACKAGE’;--找到包EXPPDROPPACKAGEEXPP;--删除包EXPP5.6触发器触发器(trigger)是许多关系数据库系统都提供的一项技术。它是存储在数据库中的对象。触发器类似过程和函数,都有声明、执行和异常处理过程的PL/SQL块。它与存储过程和函数不同的是:存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。Oracle事件Oracle事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。Oracle将触发器的功能扩展到了触发Oracle,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。5.6.1触发器的类型DML触发器

Oracle可以对DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。

替代触发器

由于在Oracle里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是Oracle8专门为进行视图操作的一种处理方法。

系统触发器Oracle8i提供了第三种类型的触发器叫系统触发器。它可以在Oracle数据库系统的事件中进行触发,如DDL语句、启动与关闭Oracle系统等。触发器组成触发事件:引起触发器被触发的事件。例如:DML语句(INSERT,UPDATE,DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。触发时间:即该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)触发。BEFORE适用于防止某些错误操作发生或实现某些业务规则,AFTER一般是为记录该操作或做某些事后处理。触发器组成触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器(指当某触发事件发生时,该触发器只执行一次)和行级(ROW)触发器(当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次)。触发器组成触发操作:即该TRIGGER被触发之后的目的和意图,正是触发器本身要做的事情。例如:PL/SQL块。条件谓词:当在触发器中包含了多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别对不同的事件进行不同的处理,需要使用Oracle提供的条件谓词。INSERTING:触发语句是INSERT,取值TRUEUPDATING:触发语句是UPDATE,取值TRUEDELETING:触发语句是DELETE,取值TRUE5.6.2创建触发器触发器创建(权限:CREATE[ANY]TRIGGER),简化语法如下:CREATE[ORREPLACE]TRIGGER触发器名{BEFORE|AFTER}{INSERT|DELETE|UPDATE[OFcolumn[,column…]]}[OR{INSERT|DELETE|UPDATE[OFcolumn[,column…]]}...]ON[schema.]表名|[schema.]视图[FOREACHROW][WHENcondition]PL/SQL块|CALLprocedure_name;无此部分,则默认为语句级创建触发器简单示例为用户方案SCOTT的emp表创建插入型触发器,当添加新员工信息时,显示“欢迎新员工加入!”。CREATEORREPLACETRIGGERtr_addEmpBEFOREINSERTONempBEGINDBMS_OUTPUT.PUT_LINE(‘欢迎新员工加入!’);ENDtr_addEmp;插入一条记录:INSERTINTOempVALUES(9688,'tomsun','salesman',7521,sysdate,2000,1000,30)表上可以建立的触发器类型每张表最多可建立12种类型的触发器,它们是:BEFOREINSERTBEFOREINSERTFOREACHROWAFTERINSERTAFTERINSERTFOREACHROWBEFOREUPDATEBEFOREUPDATEFOREACHROWAFTERUPDATEAFTERUPDATEFOREACHROW

BEFOREDELETEBEFOREDELETEFOREACHROWAFTERDELETEAFTERDELETEFOREACHROW

触发器触发次序1.执行BEFORE语句级触发器;2.

对于受语句影响的每一行:执行BEFORE行级触发器执行DML语句执行AFTER行级触发器

3.执行AFTER语句级触发器创建DML触发器DML触发器的限制:CREATETRIGGER语句文本的字符长度不能超过32KB;触发器体内的SELECT语句只能为SELECT…INTO…结构,或者为定义游标所使用的SELECT语句。触发器中不能使用数据库事务控制语句COMMIT,ROLLBACK,SVAEPOINT语句;由触发器所调用的过程或函数也不能使用数据库事务控制语句;触发器中不能使用LONG,LONGRAW类型;触发器内可以参照LOB类型列的列值,但不能通过:NEW修改LOB列中的数据;创建DML触发器示例1例1:

建立一个触发器,当职工表emp表被删除一条记录时,把被删除记录写到职工表删除日志表中去。CREATE

TABLE

emp_his

AS

SELECT

*

FROM

EMP

WHERE

1=2;

--创建空表

CREATEORREPLACETRIGGERtr_del_empBEFOREDELETEONempFOREACHROWBEGININSERTINTOemp_his(deptno,empno,ename,job,mgr,sal,comm,hiredate)VALUES(:old.deptno,:old.empno,:old.ename,:old.job,:old.mgr,:old.sal,:m,:old.hiredate);ENDtr_del_emp;

测试:DELETE

emp

WHERE

empno=7788;创建DML触发器示例2例2:限制对emp表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改emp表。CREATEORREPLACETRIGGERtr_dept_timeBEFOREINSERTORDELETEORUPDATEONempBEGINIF(TO_CHAR(sysdate,'DAY')IN('星期六','星期日'))OR(TO_CHAR(sysdate,'HH24:MI')NOTBETWEEN'08:30'AND'18:00')THENRAISE_APPLICATION_ERROR(-20001,'不是上班时间,不能修改emp表');ENDIF;END;创建DML触发器示例3例3:限定只对部门号为30的记录进行行触发器操作。CREATEORREPLACETRIGGERtr_emp_sal_commBEFOREUPDATEOFsal,commORDELETEONempFOREACHROWWHEN(old.deptno=30)BEGINCASEWHENUPDATING('salary')THENIF:NEW.sal<:old.salTHENRAISE_APPLICATION_ERROR(-20001,'部门30的人员的工资不能降');ENDIF;WHENUPDATING('commission_pct')THENIF:NEW.comm<:mTHENRAISE_APPLICATION_ERROR(-20002,'部门30的人员的奖金不能降');ENDIF;WHENDELETINGTHENRAISE_APPLICATION_ERROR(-20003,'不能删除部门30的人员记录');ENDCASE;ENDtr_emp_sal_comm;实例:

UPDATE

emp

SET

sal

=

8000

WHERE

empno=7521;

DELETE

FROM

emp

WHERE

empno

in

(7499,7521);

创建DML触发器示例4例4:在触发器中调用过程。创建表emp_insert_history:CREATETABLEemp_insert_historyASSELECTempno,deptnofromempWHERE1=2;--建一个空表创建一个过程:CREATEORREPLACEPROCEDUREadd_emp_insert_history(p_emp_idemp_insert_history.empno%type,p_department_idemp_insert_history.deptno%type)ISBEGININSERTINTOemp_insert_history(empno,deptno)VALUES(p_emp_id,p_department_id);ENDadd_job_history;创建DML触发器示例4(续)--创建触发器调用存储过程...CREATEORREPLACETRIGGERdelete_emp_historyAFTERDELETEONempFOREACHROWBEGIN

add_emp_insert_history(:old.empno,:old.deptno);--调用过程DBMS_OUTPUT.PUT_LINE('被删除的员工记录已存入历史记录表emp_insert_history!');END;测试实例:deletefromempwhereempno=7369;select*fromemp_insert_history;条件谓词触发器示例当某些事件发生时,由Oracle自动执行触发器。最好将一张表上的触发器事件编写在一个触发体中,可以大大改善性能。可以利用条件谓词进行。例如:把与emp表相关的触发事件都放在触发器emp_trigger中。条件谓词触发器示例createorreplacetriggeremp_triggerbeforedeleteorupdateorinsertonempforeachrowbeginifinsertingthendbms_output.put_line('insert触发器');endif;ifupdatingthendbms_output.put_line('update触发器');endif;ifdeletingthendbms_output.put_line('delete触发器');endif;end;创建替代(INSTEADOF)触发器创建触发器的一般语法是:CREATE

[OR

REPLACE]

TRIGGER

trigger_name

INSTEAD

OF

{INSERT

|

DELETE

|

UPDATE

[OF

column

[,

column

…]]}

[OR

{INSERT

|

DELETE

|

UPDATE

[OF

column

[,

column

…]]}...]

ON

[schema.]

view_name

--只能定义在视图上

[FOR

EACH

ROW

]

--因为INSTEAD

OF触发器只能在行级上触发,所以没有必要指定

[WHEN

condition]

PL/SQL块

|

CALL

procedure_name;INSTEADOF选项使ORACLE激活触发器,而不执行触发事件。只能对视图和对象视图建立INSTEADOF触发器,而不能对表、模式和数据库建立INSTEADOF触发器。创建替代触发器示例创建一个视图:CREATE

OR

REPLACE

VIEW

emp_view

AS

SELECT

deptno,

count(*)

total_employeer,

sum(sal)

total_salary

FROM

emp

GROUP

BY

deptno;在此视图中直接删除是非法的,如:SQL>DELETE

FROM

emp_view

WHERE

deptno=10;

DELETE

FROM

emp_view

WHERE

deptno=10ERROR位于第1行:ORA-01732:此视图的数据操纵操作非法但是,我们可以创建INSTEAD_OF触发器来为DELETE操作执行所需的处理,即删除EMP表中所有基准行。创建替代触发器示例(续)在视图上创建替代触发器:CREATE

OR

REPLACE

TRIGGER

emp_view_delete

INSTEAD

OF

DELETE

ON

emp_view

FOR

EACH

ROW

BEGIN

DELETE

FROM

emp

WHERE

deptno=

:old.deptno;

END

emp_view_delete;

测试:

DELETE

FROM

emp_view

WHERE

deptno=10;

DROP

TRIGGER

emp_view_delete;

DROP

VIEW

emp_view;

系统事件触发器系统事件触发器可以在DDL或数据库系统上被触发。DDL指的是数据定义语言,如CREATE、ALTER及DROP等。而数据库系统事件包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。系统事件触发器系统事件触发器既可以建立在一个模式上,又可以建立在整个数据库上。当建立在模式(SCHEMA)之上时,只有模式所指定用户的DDL操作和它们所导致的错误才激活触发器,默认时为当前用户模式。当建立在数据库(DATABASE)之上时,该数据库所有用户的DDL操作和他们所导致的错误,以及数据库的启动和关闭均可激活触发器。要在数据库之上建立触发器时,要求用户具有ADMINISTERDATABASETRIGGER权限。创建系统触发器创建系统触发器的语法如下:CREATE

OR

REPLACE

TRIGGER

[sachema.]trigger_name

{BEFORE|AFTER}

{ddl_event_list

|

database_event_list}

ON

{

DATABASE

|

[schema.]SCHEMA

}

[WHEN

condition]

PL/SQL_block

|

CALL

procedure_name;说明:其中:ddl_event_list:一个或多个DDL事件,事件间用OR分开;database_event_list:一个或多个数据库事件,事件间用OR分开;系统触发器的种类和事件出现的时机(前或后):事件允许的时机说明STARTUPAFTER启动数据库实例之后触发SHUTDOWNBEFORE关闭数据库实例之前触发(非正常关闭不触发)SERVERERRORAFTER数据库服务器发生错误之后触发LOGONAFTER成功登录连接到数据库后触发LOGOFFBEFORE开始断开数据库连接之前触发CREATEBEFORE,AFTER在执行CREATE语句创建数据库对象之前、之后触发DROPBEFORE,AFTER在执行DROP语句删除数据库对象之前、之后触发事件允许的时机说明ALTERBEFORE,AFTER在执行ALTER语句更新数据库对象之前、之后触发DDLBEFORE,AFTER在执行大多数DDL语句之前、之后触发GRANTBEFORE,AFTER执行GRANT语句授予权限之前、之后触发REVOKEBEFORE,AFTER执行REVOKE语句收权限之前、之后触犯发RENAMEBEFORE,AFTER执行RENAME语句更改数据库对象名称之前、之后触犯发AUDIT

/

NOAUDITBEFORE,AFTER执行AUDIT或NOAUDIT进行审计或停止审计之前、之后触发系统事件触发器举例创建一个系统事件触发器,数据库启动后记录启动时间。(1)创建系统时间触发器测试表,代码如下:CREATETABLEDB_Log(op_datetimestamp);(2)创建系统事件触发器,代码如下:CREATEORREPLACETRIGGERtr_db_startupAFTERSTARTUPONDATABASEBEGININSERTINTODB_LogVALUES(SYSDATE);ENDtr_db_startup;代码中的tr_db_startup触发器作用是在用户登录数据库时,记录登录时间。创建登录、退出触发器示例先创建一个记录用户登录的表:CREATE

TABLE

log_event

(user_name

VARCHAR2(10),

address

VARCHAR2(20),

logon_date

timestamp,

logoff_date

timestamp);

创建登录、退出触发器示例创建登录触发器:

CREATE

OR

REPLACE

TRIGGER

tr_logon

AFTER

LOGON

ON

DATABASE

BEGIN

INSERT

INTO

log_event

(user_name,

address,

logon_date)

VALUES

(ora_login_user,

ora_client_ip_address,

systimestamp);

END

tr_logon;创建退出触发器:

CREATE

OR

REPLACE

TRIGGER

tr_logoff

BEFORE

LOGOFF

ON

DATABASE

BEGIN

INSERT

INTO

log_event

(user_name,

address,

logoff_date)

VALUES

(ora_login_user,

ora_client_ip_address,

systimestamp);

END

tr_logoff;编写触发器的注意事项触发器不接受参数。一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。编写触发器的注意事项在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。编写触发器的注意事项在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能是表中的任何long和blob列。不同类型的触发器(如DML触发器、INSTEADOF触发器、系统触发器)的语法格式和作用有较大区别。5.6.3触发器的其他操作删除和禁止触发器DROPTRIGGER触发器名ALTERTRIGGER触发器名[DISABLE|ENABLE]激活“表名”的所有触发器ALTERTABLE表名ENABLEALLTRIGGERS查询触发器(USER_TRIGGERS)TIRGGER_NAMETRIGGER_TYPETRIGGERING_EVENTTABLE_OWNERTABLE_NAMEWHEN_CLAUSETRIGGER_BODY编程练习定义一个简单触发器:对表emp插入、删除、修改之前分别显示:开始插入、开始删除、开始修改。进一步学习触发器,可参考:/indexman/article/details/8023740,indexman的博客专栏5.7同义词(Synonym)同义词是数据库中表、索引或其他模式对象的一个别名。利用同义词,可为数据库对象提供一定的安全性保证,另一方面可以简化对象访问。当数据库对象改变时,只需要修改同义词而不需要修改应有程序。在开发数据库应用程序时,应尽量避免直接引用表、视图或对象的名称。DBA应当为开发人员建立对象的同义词,使他们在应用程序中使用同义词。同义词的分类同义词分为:私有同义词和公有同义词私有同义词只能被创建它的用户所有,该用户可以控制其他用户是否有权使用该同义词。公有同义词被用户组PUBLIC拥有,数据库所有用户都可以使用公有同义词。5.7.1创建同义词私有同义词(具有CREATESYNONYM权限的用户)语法如下:CREATE[ORREPLACE]SYNONYM同义词名FOR对象名;公有同义词(具有CREATEPUBLICSYNONYM权限的用户)语法如下:CREATE[ORREPLACE]PUBLICSYNONYM同义词名FOR对象名;注意:

可以创建同义词的对象包括:表、视图、序列、存储过程、函数、包、对象等。创建同义词举例SQL>conn/assysdbaSQL>GRANTcreatesynonym,createpublicsynonymtoscott;SQL>connscott/123SQL>CREATEORREPLACESYNONYMscott_syn1FORemp;SQL>CREATEORREPLACEPUBLICSYNONYMscott_syn2FORemp;5.7.2使用同义词用户可以使用自己的私有同义词.例如:UPDATEscott_syn1SETsal=2750WHEREempno=7599;5.7.3删除同义词当基础对象的名称或位置被修改后,之前的同义词就可以删除。语法:

DROP[PUBLIC]SYNONYM同义词名;说明:

删除同义词后,同义词的基础对象不会受到影响,但所有引用该同义词的对象将失效。5.8序列序列(sequence)是一种命名的数据库对象,也是顺序编号生成器,可用于生成不重复连续整数,通常用来填充数字类型的主键列。序列产生的数字最大长度可达到38位十进制数。序列不占用实际的存储空间,在数据字典中只存储序列的定义描述。5.8.1创建序列语法如下:CREATESEQUENCE<序列名>[起始值]--起始值默认为1[INCREMENTBY整数增量]--默认值为1,负值,则递减[MAXVALUEn|NOMAXVALUE][MINVALUEn|NOMINVALUE][CYCLE|NOCYCLE][CACHEn|NOCACHE];--序列的最大值,默认是NOMAXVALUE。递增序列能产生的最大值时1027

,递减序列的最小值是-1--序列的最小值,默认是NOMINVALUE。递增序列的最小值是1,递减序列的最小值-1026

--缓冲,设置是否在缓存中预先分配一定数量的数据值,以提高获取序列值的速度,默认为缓存20个值。创建序列举例1创建一个用户编号序列:CREATESEQUENCEuser_seq;CREATESEQUENCEtest_seq1STARTWITH10INCREMENTBY5MINVALUE10MAXVALUE20CYCLECACHE2;CREATESEQUENCEtest_seq2STARTWITH10INCREMENTBY-1MINVALUE1MAXVALUE10CYCLECACHE5;获取序列的信息:user_sequences视图5.8.2使用序列序列生成一系列数字。一个序列中包含两个“伪列”:currval和nextval,可以分别用来获取该序列的当前值和下一个值。例如:SELECTuser_seq.nextvalFROMdual;SELECTuser_seq.currvalFROMdual;SELECTuser_seq.nextvalFROMdual;5.8.3使用序列填充主键当表的主键是整数时,通常使用序列来生成主键。先建一个表:CREATETABLEuser_info(idINTEGERprimarykey,statusvarchar2(10),last_modifiedDATEDEFAULTSYSDATE);添加记录:INSERTINTOuser_infoVALUES(user_seq.nextval,'placed',SYSDATE);INSERTINTOuser_infoVALUES(user_seq.nextval,‘changed',SYSDATE);5.8.4修改序列语法如下:

ALTERSEQUENCE<序列名>……注意!可以修改的序列内容有如下限制:

不能修改序列的初值;

序列的最小值不能大于当前值;

序列的最大值不能小于当前值。例如:ALTERSEQUENCEtest_seq2INCREMENTBY3;5.8.5删除序列语法如下:DROPSEQUENCE<序列名>;补充:异常处理用户编写的PL/SQL块在执行过程中难免会发生一些错误或者异常情况。例如,除数为0或者无法建立到Oracle的连接等。这里涉及的错误并不是由于程序的语法错误引起的,而是因为程序在运行时引发的错误,这就是异常。好的程序应该对可能发生的异常情况进行处理。如果要在PL/SQL块中对异常进行处理,就需要在异常处理部分EXCEPTION块中编写处理程序。异常处理举例例如:DECLAREwidthINTEGER;

heightINTEGER:=0;-此处给0,则后面执行块中代码会引发异常areaINTEGER:=6;BEGINwidth:=area/height;--引发异常DBMS_OUTPUT.PUT_LINE('width='||width);EXCEPTION--异常处理WHENZERO_DIVIDETHENDBMS_OUTPUT.PUT_LINE('除数是0!请重新设置除数!');END;EXCEPTION块用于处理除以零的错误。程序在运行时,若异常发生,控制权将转交给EXCEPTION块,其中的WHEN子句负责检查与何种异常相匹配,然后执行匹配子句中的代码。异常处理的基本语法基本语法格式如下:EXCEPTIONWHEN异常名1[OR异常名2…]THEN--异常列表 语句序列1;

[WHEN异常名3[OR异常名4

…]THEN 语句序列2;

…[WHENOTHERSTHEN 语句序列n;END;可以对多个异常分别进行不同的处理,也可以进行相同的处理。异常的种类分为三大类:系统预定义的异常Oracle为用户提供了大量的在PL/SQL中使用的预定义异常,以检查用户代码失败的一般原因。它们都定义在Oracle的核心PL/SQL库中,用户可以在自己的PL/SQL异常处理部分使用名称对其进行标识。对这种异常情况的处理,无需在程序中定义,由Oracle自动将其引发。非预定义的异常即其他标准的Oracle错误。对这种异常情况的处理,需要用户在程序中定义,然后由Oracle自动将其引发。用户自定义异常程序员可以把一些特定的状态定义为异常,在一定的条件下抛出,然后利用异常处理机制进行处理。异常号异常关键字说明ORA_1001INVALID_CURSOR非法游标操作ORA_1012NOT_LOGGED_ON没连接到oracleORA_1403NOT_DATA_FOUND没有找到数据ORA_1722INVALID_NUMBER转换数字时失败ORA_6500STOREAGE_ERROR内存不够ORA_6501PROGRAM_ERRO

温馨提示

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

最新文档

评论

0/150

提交评论