分布式DBA:掌握SQL存储过程
2008-09-01 09:58:34 来源:WEB开发网SQL 存储过程格式
与单个 SQL 语句不同,大部分情况中,SQL 存储过程体由一个或多个复合 SQL 语句组成。复合 SQL 语句只是由关键字 BEGIN 和 END 封装的两个或多个 SQL 语句或 SQL PL 对象,并且以分号结尾。一条 ATOMIC 复合 SQL 语句可以认为是单个的整体吗?如果在其中产生任何未处理的错误条件,所有执行到该点的语句都被认为已经失败,并且回滚对数据库所做的任何更改。
当复合语句用来创建 SQL 存储过程体时,它可以包含几个逻辑部分。为了正确地开发一个 SQL 存储过程,使用的每个部分都必须以非常特定的顺序实现。每个逻辑部分必须依据的实现顺序如下所示: <标签:> BEGIN
变量声明
条件声明
游标声明
条件处理程序声明
赋值,流程控制,SQL 语句和其它复合语句
END <标签>
正如这个格式结构所示,可选的变量、条件和条件处理程序声明必须在存储过程逻辑(使用 SQL PL 流程控制语句实现)和 SQL 语句之前。游标可以在任何地方声明,但是最好在任何条件处理程序声明之前定义。
SQL 存储过程可以由遵循此格式的一个或多个复合语句(或块)组成,这些块可以嵌套或依次执行。为了清晰地显示流程控制,每个块都可以加上标签,从而可以包含许多 SQL 语句。这使进行控制转移语句引用时更加容易实现精确性。
清单 2 显示一个其存储过程体由几个嵌套复合 SQL 语句组成的 SQL 存储过程,它们遵循刚才所述的格式。可以在 DB2 9 SQL Reference(卷 2)中的标题 “复合 SQL(存储过程)” 下找到关于这种格式的更多信息,以及如何对每个部分进行编码的详细信息和例子。
清单 2. 饱含多个子句的存储过程
CREATEPROCEDUREhr.adjust_salary
(INempidINTEGER,INratingINTEGER,OUTmsgVARCHAR(128))
DYNAMICRESULTSETS1
MODIFIESSQLDATA
DETERMINISTIC
LANGUAGESQL
main:BEGIN
DECLARESQLSTATECHAR(5)DEFAULT'00000';
DECLARESQLCODEINTEGERDEFAULT0;
DECLAREnot_foundCONDITIONFORSQLSTATE'02000';
DECLAREc1CURSORWITHRETURNFORSELECT*FROMhr.employees;
error_handler:BEGIN
DECLAREEXITHANDLERFORnot_found
SIGNALSQLSTATE'20000'SETMESSAGE_TEXT='EmployeeIDnotfound';
work:BEGINATOMIC
IF(rating=1)THEN
UPDATEhr.employeesSETsalary=salary*1.10
WHEREemp_id=empid;
ELSEIF(rating=2)THEN
UPDATEhr.employeesSETsalary=salary*1.05
WHEREemp_id=empid;
ELSEIF(rating=3)THEN
UPDATEhr.employeesSETsalary=salary*1.03
WHEREemp_id=empid;
ELSE
UPDATEhr.employeesSETput_on_plan='Y'
WHEREemp_id=empid;
ENDIF;
SETmsg='UpdatedrecordforemployeewithID='||CHAR(empid);
ENDwork;
ENDerror_handler;
OPENc1;
ENDmain
- ››分布式计算多机部署与配置
- ››分布式单词发音抓取机器人
- ››分布式网络爬虫关键技术分析与实现一网络爬虫相关...
- ››分布式 DBA: 创建和使用分区表
- ››分布式 Key-Value 存储系统:Cassandra 入门
- ››分布式 DBA: Cursor Stability Isolation Level 的...
- ››掌握技巧 DNS服务器快速排错
- ››掌握迅雷5.9常用快捷键 让你快如闪电
- ››掌握 Dojo 工具包,第 8 部分: 明日之星 - DojoX
- ››掌握 Facebook 应用程序开发,使用 PHP、RAD、WAS...
- ››掌握 Facebook 应用程序开发,使用 PHP、RAD、WAS...
- ››分布式 DBA:存储、I/O 和 DB2,第 1 部分(针对在...
更多精彩
赞助商链接