DB2存储过程--基础详解
DB2存储过程精简教程

DB2存储过程精简教程DB2存储过程是一种在数据库服务器上执行的可重复使用的代码块,用于完成特定任务。
它可以接受输入参数,并返回结果。
存储过程有助于提高数据库性能和安全性。
在这篇文章中,我们将介绍如何创建和使用DB2存储过程。
一、创建存储过程要创建存储过程,您需要先登录到DB2数据库服务器。
然后,使用CREATEPROCEDURE语句指定存储过程的名称、输入参数和返回结果。
下面是一个示例:CREATE PROCEDURE get_employee(IN employee_id INT, OUT employee_name VARCHAR(255))BEGINSELECT name INTO employee_name FROM employees WHERE id = employee_id;END上面的代码创建了一个名为get_employee的存储过程。
它接受一个输入参数employee_id,并通过输出参数employee_name返回相应的员工姓名。
二、执行存储过程要执行存储过程,您可以使用CALL语句,如下所示:CALL get_employee(1001, ?);上面的代码将调用get_employee存储过程,并将1001作为输入参数传递。
由于我们使用了输出参数,所以使用问号来表示它。
调用语句将返回存储过程中定义的输出参数的值。
三、存储过程中的控制结构存储过程可以包含各种控制结构,如条件语句和循环语句。
下面是一个示例:CREATE PROCEDURE calculate_salary(IN employee_id INT)BEGINDECLARE monthly_salary DECIMAL(10, 2);DECLARE tax DECIMAL(10, 2);SELECT salary / 12 INTO monthly_salary FROM employees WHERE id = employee_id;IF monthly_salary > 5000 THENSET tax = monthly_salary * 0.2;ELSESET tax = monthly_salary * 0.1;ENDIF;SELECT monthly_salary, tax;END上面的代码创建了一个名为calculate_salary的存储过程。
DB2存储过程基本语法

DB2存储过程基本语法存储过程的基本语法如下:1.创建存储过程:```sqlCREATE PROCEDURE procedure_name [ (parameter_name parameter_data_type [, ...]) ]BEGIN-- SQL statementsEND;```存储过程使用`CREATEPROCEDURE`语句来创建,指定存储过程的名称以及可选的参数。
然后使用`BEGIN`和`END`之间的SQL语句来定义过程的操作。
2.存储过程参数:存储过程可以接收参数,并且可以设置参数的初始值。
```sqlCREATE PROCEDURE procedure_name (IN parameter_name parameter_data_type [DEFAULT default_value])BEGIN-- SQL statementsEND;```参数可以设置为输入(IN)参数或者输出(OUT)参数,用于接收过程内部的数据或者返回数据。
3.存储过程返回结果:存储过程可以返回结果集或者只是执行一些操作而不返回结果。
```sqlCREATE PROCEDURE procedure_nameDYNAMIC RESULT SETS integerBEGIN-- SQL statementsEND;```使用`DYNAMICRESULTSETS`关键字来指定结果集的数量。
如果存储过程不返回结果集,可以省略这一行。
4.存储过程操作:存储过程可以包含SQL语句,例如SELECT、INSERT、UPDATE和DELETE等操作。
可以使用条件判断、循环等控制流语句来实现复杂的逻辑。
```sqlCREATE PROCEDURE procedure_nameBEGINDECLARE variable_name data_type [DEFAULT value];-- Variable declarationSET variable_name = value;-- Variable assignment-- SQL statementsIF condition THEN-- StatementsELSEIF condition THEN-- StatementsELSE-- StatementsENDIF;WHILE condition DO-- StatementsENDWHILE;FOR variable_name [AS] data_type [DEFAULT value] TO value DO -- StatementsENDFOR;REPEAT-- StatementsUNTIL condition END REPEAT;-- Other control flow statementsEND;```使用`DECLARE`关键字声明变量,使用`SET`关键字为变量赋值。
DB2 SQLJ 存储过程开发宝典,第 1 部分_216_IT168文库

DB2 SQLJ 存储过程开发宝典,第1 部分简介: SQLJ 存储过程开发宝典将分为 2 个部分。
本文是第 1 部分,在介绍SQLJ 的基础知识的基础上,结合实例,详细介绍如何一步步开发SQLJ 存储过程以及常用的调试方法。
在第2 部分中,我们将集中介绍开发SQLJ 存储过程的常见问题及其解决方法。
SQLJ 的基础知识1. 基本概念SQLJ 是 Java 应用程序与数据库进行数据传递的一种方式,它是将静态 SQL 语句嵌入在 Java 代码中的一种非过程语言。
SQLJ 为标准的 Java 程序提供了一种访问数据库的扩展能力,程序员只需要在 Java 代码中添加以特定符号标记的SQL 语句,Java 程序就可以从数据库获取数据,插入、更新或删除数据库中的数据。
不过,我们把这种嵌入了 SQL 语句的 Java 代码为 SQLJ 源代码。
下面是一段简单的 SQLJ 代码示例,我们可以一睹 SQLJ 代码的“芳容”。
清单1. SQLJ 代码片段示例try{// Retrieve Info from database tableString hostVar = null;#sql[ctx]{SELECT col INTO :hostvar FROM tablename WHERE objID=:objectID};} catch(SQLException e){logf("Error: Cannot execute SQL statement.");e.printStackTrace();}回到 SQLJ 技术本身,它是由 IBM、Oracle 和 Sybase 等数据库厂商于 1997 年提出的技术规范,确定了如何在 Java 变成语言中使用静态 SQL 语句。
同年 12 月,Oracle 提供了 SQL 嵌入于 Java 代码中的参考实现,该参考实现可以运行在任何支持 JDK1.1 的平台。
db2存储过程动态游标及函数返回值总结

db2存储过程动态游标及函数返回值总结DB2存储过程是一种在数据库服务器上执行的事务处理程序,它可以包含SQL语句、控制结构和变量。
在存储过程中,我们经常会使用动态游标和函数返回值来实现一些特定的功能。
下面是关于DB2存储过程中动态游标和函数返回值的总结。
一、动态游标1.动态游标是在存储过程中动态定义的一种游标,它可以根据不同的条件进行查询,并返回满足条件的结果集。
动态游标的定义和使用步骤如下:1.1定义游标:使用DECLARECURSOR语句定义游标,并指定游标的名称和返回结果集的查询语句。
1.2打开游标:使用OPEN语句打开游标,并执行查询语句,将结果集保存在游标中。
1.3获取数据:使用FETCH语句获取游标中的数据,并进行相应的处理。
1.4关闭游标:使用CLOSE语句关闭游标,释放资源。
2.动态游标的优势:2.1灵活性:动态游标可以根据不同的条件查询不同的结果集,满足特定的业务需求。
2.2可读性:通过使用动态游标,可以使存储过程的代码更加清晰和易于理解。
2.3性能优化:动态游标可以根据实际情况进行优化,提高查询性能。
3.动态游标的注意事项:3.1游标的生命周期:动态游标的生命周期是在存储过程执行期间,一旦存储过程结束,游标也会自动关闭。
3.2游标的维护成本:动态游标的使用需要消耗一定的系统资源,所以在使用动态游标时需要注意资源的管理。
二、函数返回值1.函数返回值是存储过程中的一个重要特性,它可以将计算结果返回给调用者。
DB2支持返回多个值的函数,可以通过函数返回表、游标或者多个标量值来实现。
2.函数返回值的定义和使用步骤如下:2.1定义函数返回值:在存储过程中使用RETURNS子句定义函数返回的数据类型。
2.2设置函数返回值:在存储过程中使用SET语句设置函数返回的值。
2.3使用函数返回值:在调用存储过程时,可以使用SELECT语句或者VALUES语句获取函数返回的值。
3.函数返回值的优势:3.1灵活性:函数返回值可以根据实际需求返回不同的结果,满足不同的业务场景。
SQLSERVER和DB2存储过程规范实例

• 带输出存储过程示例
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = \'%\', @@SUM money OUTPUT AS SELECT \'Title Name\' = title FROM titles WHERE title LIKE @@TITLE SELECT @@SUM = SUM(price) FROM titles WHERE title LIKE @@TITLE GO 说明 OUTPUT 变量必须在创建表和使用该变量时都进行定义。 参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。
• 什么是SQL语言?
SQL语言是应用程序和SQL Server数据库之间的主要 编程接口。使用SQL语言编写代码时,可用两种方法 存储和执行代码。
① 第一种是在客户端存储代码,并创建向数据库管理系统发送S QL命令(或SQL语句)并处理返回结果给应用程序; ② 第二种是将这些发送的SQL语句存储在数据库管理系统中,这 些存储在数据库管理系统中的SQL语句就是存储过程。
• 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程, 使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 sysco mments 表中获取关于该过程的信息。 GO USE pubs GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM authors GO EXEC sp_helptext encrypt_this
db2存储过程

USE_CUST_ID NUMBER(12),
ADDRESS_ID NUMBER(12),
COMMON_REGION_ID NUMBER(12),
BASIC_STATE VARCHAR2(10),
EXT_STATE VARCHAR2(3),
VOICE_AOC_TYPE CHAR(3),
DATA_AOC_TYPE CHAR,
ISMP_AOC_TYPE CHAR,
STOP_RENT_DATE DATE,
USE_LATN_ID NUMBER(9),
PAY_LATN_ID NUMBER(9)
)
insert into PROD_INST_919
(
CONTRACT_ID NUMBER(12),
ACCT_ID NUMBER(12),
INSTALL_DATE DATE,
ADDRESS_DESC VARCHAR2(250),
LAST_ORDER_ID NUMBER(12),
PHYSICAL_NBR VARCHAR2(20),
INSTALL_ADDR VARCHAR2(250),
EXT_PROD_INST_ID VARCHAR2(30),
BEGIN_RENT_DATE DATE,
tn_id LATN_ID --本地网标识
from
CIMM.V_USER_INFO_day a
left join det.ofr_prd_inst_main b on a.prd_inst_id=b.prd_inst_id
left join LCUST.SERV_ACCT c on b.serv_id=c.serv_id
DB2_存储过程执行计划的查看及监控方法

一,编写存储过程。
[db2inst1@db2lab ~]$ cat test.sqlcreate procedure sales_status(in quota integer)dynamic result sets 2language sqlbegindeclare SQLSTATE char(5);declare rs cursor with return forselect * from t1;open rs;end@二,建立存储过程[db2inst1@db2lab~]$**************DB20000I The SQL command completed successfully.三,执行存储过程[db2inst1@db2lab ~]$ db2 "call sales_status(1)"Result set 1--------------ID-------1.1 record(s) selected.Return Status = 0四,利用表函数MON_GET_PKG_CACHE_STMT抓取static的信息,获取PACKAGE_NAME及SQL语句[db2inst1@db2lab ~]$ db2 "selectPACKAGE_NAME,SECTION_NUMBER,EXECUTABLE_IDfrom TABLE(MON_GET_PKG_CACHE_STMT ( 'S', NULL, NULL, -1)) as T" PACKAGE_NAMESECTION_NUMBER EXECUTABLE_ID -------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------------------------------------------------------P04624831x'0100000000000000BE0100000000000001000000010020140415004624839232' 1 record(s) selected.五,利用EXECUTABLE_ID,获取SQL语句[db2inst1@db2lab ~]$ db2 "SELECT STMT_TEXT FROMTABLE(MON_GET_PKG_CACHE_STMT> (null,x'0100000000000000BE0100000000000001000000010020140415004624839232', null, -2))"STMT_TEXT-------------------------------------------------------DECLARE RS cursor with return forselect * from T1 where ID = :HV00008 :HI000081 record(s) selected.六,查看package_name信息,valid列信息需要重点关注,信息中心解释如下:•N = Needs rebinding•V = Validate at run time•X = Package is inoperative because some function instance on which it depends has been dropped; explicit rebind is needed•Y = Valid[db2inst1@db2lab ~]$ db2 list packages for all |grep -i P0462483Bound Total Isolation Package Schema Version by sections Valid Format level Blocking----------- --------- ----------- --------- ------------- ------- -------- --------- --------P0462483 DB2INST1 DB2INST1 1Y 0 CS U七,获取该package_name的执行计划信息[db2inst1@db2lab ~]$ db2expln -d pos -g -c db2inst1 -p P0462483 -s 0 -tDB2 Universal Database Version 9.7, 5622-044 (c) Copyright IBM Corp. 1991, 2008 Licensed Material - Program Property of IBMIBM DB2 Universal Database SQL and XQUERY Explain Tool******************** PACKAGE ***************************************Package Name = "DB2INST1"."P0462483" Version =Prep Date = 2014/04/15Prep Time = 00:46:24Bind Timestamp = 2014-04-15-00.46.24.839232Isolation Level = Cursor StabilityBlocking = Block Unambiguous CursorsQuery Optimization Class = 5Partition Parallel = NoIntra-Partition Parallel = NoSQL Path = "SYSIBM", "SYSFUN", "SYSPROC", "SYSIBMADM","DB2INST1"-------------------- SECTION ---------------------------------------Section = 1Statement:DECLARE RS cursorwith returnforselect *from T1where ID =:HV00008 :HI00008Section Code Page = 1208Estimated Cost = 7.569436Estimated Cardinality = 1.000000Access Table Name = DB2INST1.T1 ID = 2,4| #Columns = 1| Skip Inserted Rows| Evaluate Block/Data Predicates Before Locking Committed Row| May participate in Scan Sharing structures| Scan may start anywhere and wrap, for completion| Fast scan, for purposes of scan sharing management| Scan can be throttled in scan sharing management| Relation Scan| | Prefetch: Eligible| Lock Intents| | Table: Intent Share| | Row : Next Key Share| Sargable Predicate(s)| | #Predicates = 1| | Return Data to Application| | | #Columns = 1Return Data CompletionEnd of sectionOptimizer Plan:RowsOperator(ID)Cost1RETURN( 1)7.56944|1TBSCAN( 2)7.56944|1Table:DB2INST1T1总结:DB2的执行计划变化较多,不经常runstats和rebind的时候,有可能本地执行计划很好,但在实际生产环境上执行计划较差,这需要DBA能抓取实时SQL执行计划,静态sql通过上述方式抓取,动态sql需要借助db2expln的cache选项抓取,来分析sql的消耗情况Dynamic Statement Options:-cache <anchID>,<stmtUID>,<envID>,<varID>= Retrieve the statement identified by the given IDsfrom the dynamic SQL cache. (The IDs can beobtained by running db2pd with the -dynamicoption.。
DB2存储过程学习总结

Db2 存储过程学习总结●在命令窗口执行存储过程,可以方便看出存储过程在哪一行出现错误,方便修改。
●db2 存储过程常用语句格式----定义DECLARE CC VARCHAR(4000);DECLARE SQLSTR VARCHAR(4000);DECLARE st STATEMENT;DECLARE CUR CURSOR WITH RETURN TO CLIENT FOR CC;----执行动态SQL不返回PREPARE st FROM SQLSTR;EXECUTE st;----执行动态SQL返回PREPARE CC FROM SQLSTR;OPEN CUR;----判断是否为空,使用值替代COALESCE(判断对象,替代值)----定义临时表DECLARE GLOBAL TEMPORARY TABLE SESSION.TempResultTable(Organization int,OrganizationName varchar(100),AnimalTypeName varchar(20),ProcessType int,OperatorName varchar(100),OperateCount int)WITH REPLACE -- 如果存在此临时表,则替换NOT LOGGED;DB2 9.x临时表使用总结1). DB2的临时表需要用命令Declare Temporary Table来创建,并且需要创建在用户临时表空间上;2). DB2在数据库创建时,缺省并不创建用户临时表空间,如果需要使用临时表,则需要用户在创建临时表之前创建用户临时表空间;3). 临时表的模式为SESSION,SESSION即基于会话的,且在会话之间是隔离的。
当会话结束时,临时表的数据被删除,临时表被隐式卸下。
对临时表的定义不会在SYSCAT.TABLES中出现 .;4). 缺省情况下,在Commit命令执行时,DB2临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;5). 运行ROLLBACK命令时,用户临时表将被删除;下面是DB2临时表定义的一个示例:DECLARE GLOBAL TEMPORARY TABLE results(RECID VARCHAR(32) , --idXXLY VARCHAR(100), --信息来源LXDH VARCHAR(32 ), --信息来源联系电话FKRQ DATE --反馈时间) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;----字符串函数Substr----隐形游标迭代for 游标名as select....... do使用游标名.字段名内容区块end for;----直接返回值或变量declare rs1 cursor with return to caller for select 0 from sysibm.sysdummy1;----判断表是否存在select count(*) into @exists from syscat.tables where tabschema = current schema and tabname='ZY_PROCESSLOG';----取前面N条记录select * from 表名FETCH FIRST N ROWS ONLY----定义返回值declare rs0 cursor with return to caller for select 0 from sysibm.sysdummy1;declare rs1 cursor with return to caller for select 1 from sysibm.sysdummy1;----得到插入的自增长列最大值VALUES IDENTITY_VAL_LOCAL() INTO 变量Merge into [A] using [B] on 条件when ***通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表语法如下MERGE INTO [your table-name] [rename your table here]USING ( [write your query here] )[rename your query-sql and using just like a table]ON ([conditional expression here] AND [...]...)WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]我们先看看一个简单的例子,来介绍一个merge into的用法merge into products p using newproducts np on (p.product_id = np.product_id)when matched thenupdate set p.product_name = np.product_namewhen not matched theninsert values(np.product_id, np.product_name, np.category)在这个例子里。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DB2存储过程-基础详解2010-12-20 来源:网络简介DB2 SQL Procedural Language(SQL PL)是SQL Persistent Stored Module 语言标准的一个子集。
该标准结合了SQL 访问数据的方便性和编程语言的流控制。
通过SQL PL 当前的语句集合和语言特性,可以用SQL 开发综合的、高级的程序,例如函数、存储过程和触发器。
这样便可以将业务逻辑封装到易于维护的数据库对象中,从而提高数据库应用程序的性能。
SQL PL 支持本地和全局变量,包括声明和赋值,还支持条件语句和迭代语句、控制语句的转移、错误管理语句以及返回结果集的方法。
这些话题将在本教程中讨论。
变量声明SQL 过程允许使用本地变量赋予和获取SQL 值,以支持所有SQL 逻辑。
在SQL 过程中,在代码中使用本地变量之前要先进行声明。
清单 1 中的图演示了变量声明的语法:清单 1. 变量声明的语法.-,-----------------.V ||--DECLARE----SQL-variable-name-+------------------------------->.-DEFAULT NULL------.>--+-data-type--+-------------------+-+-------------------------|| '-DEFAULT--constant-' |SQL-variable-name 定义本地变量的名称。
该名称不能与其他变量或参数名称相同,也不能与列名相同。
图 1 显示了受支持的DB2 数据类型:DEFAULT值– 如果没有指定,在声明时将赋值为NULL。
下面是变量声明的一些例子:•DECLARE v_salary DEC(9,2) DEFAULT 0.0;•DECLARE v_status char(3) DEFAULT ‘YES’;•DECLARE v_descrition VARCHAR(80);•DECLARE v1, v2 INT DEFAULT 0;请注意,从DB2 version 9.5 开始才支持在一个DECLARE 语句中声明多个相同数据类型的变量。
数组数据类型SQL 过程从9.5 版开始支持数组类型的变量和参数。
要定义一个数组类型的变量,需要先在数据库中创建该类型,然后在过程或应用程序中声明它。
数组是临时的值,可以在存储过程和应用程序中操纵它,但是不能将它存储到表中。
DB2 支持以下创建数组数据类型的语法:清单 2. 创建数组数据类型的语法Sql代码1.>>-CREATE TYPE—array-type-name--AS--| data-type |--ARRAY--[---------->2.3. .-2147483647-------.4.>--+------------------+--]-------------------------------------><5. '-integer-constant-'数组类型的名称应该用模式加以限定,并且在当前服务器上应该是惟一的。
LONG VARCHAR、LONG VARGRPAHIC、XML 和用户定义类型不能作为数组元素的数据类型。
下面是数组类型的例子:Sql代码1.CREATE TYPE numbers as INTEGER ARRAY[100];2.CREATE TYPE names as VARCHAR(30) ARRAY[];3.CREATE TYPE MYSCHEMA.totalcomp as DECIMAL(12,2) ARRAY[];请注意,整数“constant” 指定数组的最大基数,它是可选的。
数组元素可以通过ARRAY-VARIABLE(subindex) 来引用,其中subindex 必须介于 1 到数组的基数之间。
现在可以在SQL 过程中使用这个数据类型:清单 3. 在过程中使用数组数据类型Sql代码1.CREATE PROCEDURE PROC_VARRAY_test (out mynames names)2. BEGIN3.DECLARE v_pnumb numbers;4.SET v_pnumb = ARRAY[1,2,3,5,7,11];5.SET mynames(1) =’MARINA’;6.7.…8.ENDDB2 支持一些操作数组的方法。
例如,函数CARDINALITY(myarray) 返回一个数组中元素的个数。
赋值SQL PL 提供了SET 语句来为变量和数组元素赋值。
下面是一个SET 语句的简化的语法:SET variable_name = value/expression/NULL;这个变量名可以是一个本地变量、全局变量或数组元素的名称。
下面是一些例子:如果关闭该游标,则结果集将不能返回给调用者应用程序。
清单10 演示了一个游标的声明,该游标从一个过程中返回一个结果集:清单10. 返回一个结果集的游标的声明CREATE PROCEDURE emp_from_dept()DYNAMIC RESULT SETS 1P1: BEGINDECLARE c_emp_dept CURSOR WITH RETURNFOR SELECT empno, lastname, job, salary, comm.FROM employeeWHERE workdept = ‘E21’;OPEN c_emp_dept;END P1游标处理为了在一个过程中处理一个游标的结果,需要做以下事情:1.在存储过程块的开头部分DECLARE 游标。
2.打开该游标。
3.将游标的结果取出到之前已声明的本地变量中(隐式游标处理除外,在下面的FOR 语句中将对此加以解释)。
4.关闭该游标。
(注意:如果现在不关闭游标,当过程终止时将隐式地关闭游标)。
条件语句SQL PL 中支持两种类型的条件语句— IF 语句和CASE 语句。
IF 语句通过IF 语句可以根据一个条件的状态来实现逻辑的分支。
IF 语句支持使用可选的ELSEIF子句和默认的ELSE子句。
END IF子句是必需的,它用于表明IF 语句的结束。
清单11 展示了一个示例IF 语句。
清单11. IF 语句示例IF years_of_serv > 30 THENSET gl_sal_increase = 15000;ELSEIF years_of_serv > 20 THENSET gl_sal_increase = 12000;ELSESET gl_sal_increase = 10000;END IF;CASE 语句SQL PL 支持两种类型的CASE 语句,以根据一个条件的状态实现逻辑的分支:•simple CASE 语句用于根据一个字面值进入某个逻辑。
•searched CASE 语句用于根据一个表达式的值进入某个逻辑。
清单12 显示了使用searched CASE 语句的一个存储过程的例子。
清单12. 使用searched CASE 语句的存储过程CREATE PROCEDURE sal_increase_lim1 (empid CHAR(6)) BEGINDECLARE years_of_serv INT DEFAULT 0;DECLARE v_incr_rate DEC(9,2) DEFAULT 0.0;SELECT YEAR(CURRENT DATE) - YEAR(hiredate)INTO years_of_servFROM empl1WHERE empno = empid;CASEWHEN years_of_serv > 30 THENSET v_incr_rate = 0.08;WHEN years_of_serv > 20 THENSET v_incr_rate = 0.07;WHEN years_of_serv > 10 THENSET v_incr_rate = 0.05;ELSESET v_incr_rate = 0.04;END CASE;UPDATE empl1SET salary = salary+salary*v_incr_rateWHERE empno = empid;END迭代语句SQL PL 支持一些重复执行某个逻辑的方法,包括简单的LOOP、WHILE 循环、REPEAT 循环和FOR 循环:•LOOP 循环-- 简单的循环o L1: LOOPo SQL statements;o LEAVE L1;o END LOOP L1;•WHILE 循环-- 进入前检查条件o WHILE conditiono DOo SQL statementso END WHILE;•REPEAT 循环-- 退出前检查条件o REPEATo SQL statements;o UNTIL conditiono END REPEAT;•FOR 循环-- 结果集上的隐式循环o FOR loop_name ASo SELECT … FROMo DOo SQL statements;o END FOR;请注意,FOR 语句不同于其他的迭代语句,因为它用于迭代一个定义好的结果集中的行。
为了演示这些循环技巧的使用,我们来编写一个过程,该过程从一个EMPLOYEE 表中获取每个雇员的姓氏、工作年限和年龄,并将其插入到新表REPORT_INFO_DEPT 中,这些信息分别被声明为lname varchar(15)、hiredate date 和birthdate date。
请注意,使用一个简单的SQL 语句也可以做同样的事情,但是在这个例子中我们使用 3 种不同的循环语句。
清单13. 简单的循环例子CREATE PROCEDURE LEAVE_LOOP (DEPTIN char(3), OUT p_counter INTEGER) Ll: BEGINDECLARE v_at_end , v_counter INTEGER DEFAULT 0;DECLARE v_lastname VARCHAR(15);DECLARE v_birthd, v_hired DATE;DECLARE c1 CURSORFOR SELECT lastname, hiredate, birthdate FROM employeeWHERE WORKDEPT = deptin;DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_at_end = 1;OPEN c1;FETCH_LOOP: LOOPFETCH c1 INTO v_lastname, v_hired, v_birthd;IF v_at_end <> 0 THEN -- loop until last row of the cursor LEAVE FETCH_LOOP;END IF;|--DECLARE--+-CONTINUE-+--HANDLER--FOR--------------------------> +-EXIT-----+'-UNDO-----'>--+-specific-condition-value-+--| SQL-procedure-statement |----|'-general-condition-value--'WHERE specific-condition-value.-,----------------------------------------.V .-VALUE-. ||----+-SQLSTATE--+-------+--string-constant-+-+-----------------|'-condition-name-----------------------'下面是演示它如何工作的一些例子。