当前位置:文档之家› db2存储过程优化

db2存储过程优化

db2存储过程优化
db2存储过程优化

DB2 提供的强大功能可以让开发人员创建出非常高效稳定的存储过程。但对于初学者来说,开发出这样的程序并不轻易。本文主要讨论开发高效稳定的DB2 存储过程的一些常用技巧和方法。读者定位为具有一定开发经验的DB2 开发经验的开发人员。读者可以从本文学习到如何编写稳定、高效的存储过程。并可以直接使用文章中提供的DB2 代码,从而节省他们的开发和调试时间,提高效率。

本文以DB2 开发人员的角度介绍了在DB2 存储过程开发中需要注重的事项和技巧。新手假如能够按照本文介绍的最佳实践来开发存储过程,可以避免一些常见的错误,从而编写出高效的程序。本文从初始化参数、游标、异常处理、临时表的使用以及如何寻找并rebind 非法存储过程等常见问题进行了着重讨论,并且给出了示例代码。在存储过程中,开发人员能够声明和设置SQL 变量、实现流程控制、处理异常、能够对数据进行插入、更新或者删除。同时,客户应用(这里指调用存储过程的应用程序,它可以是JDBC 的调用,也可以是ODBC 和CLI 等)和存储过程之间可以传递参数,并且从存储过程中返回结果集。其中,使用SQL 编写的DB2 存储过程是在开发中常见的一种存储过程。本文主要讨论此类存储过程。

最佳实践

1:在创建存储过程语句中提供必要的参数

创建存储过程语句(CREATE PROCEDURE)可以包含很多参数,虽然从语法角度讲它们不是必须的,但是在创建存储过程时提供它们可以提高执行效率。下面是一些常用的参数容许SQL (allowed-SQL)容许SQL (allowed-SQL)子句的值指定了存储过程是否会使用SQL 语句,假如使用,其类型如何。它的可能值如下所示:NO SQL:表示存储过程不能够执行任何SQL 语句。CONTAINS SQL:表示存储过程可以执行SQL 语句,但不会读取SQL 数据,也不会修改SQL 数据。READS SQL DATA:表示在存储过程中包含不会修改SQL 数据的SQL 语句。也就是说该储存过程只从数据库中读取数据。MODIFIES SQL DATA:表示存储过程可以执行任何SQL 语句。即可以对数据库中的数据进行增加、删除和修改。假如没有明确声明allowed-SQL,其默认值是MODIFIES SQL DATA。不同类型的存储过程执行的效率是不同的,其中NO SQL 效率最好,MODIFIES SQL DATA 最差。假如存储过程只是读取数据,但是因为没有声明allowed-SQL 使其被当作对数据进行修改的存储过程来执行,这显然会降低程序的执行效率。因此创建存储过程时,应当明确声明其allowed-SQL。

返回结果集个数(DYNAMIC RESULT SETS n)存储过程能够返回0 个或者多个结果集。为了从存储过程中返回结果集,需要执行如下步骤:在CREATE PROCEDURE 语句的DYNAMIC RESULT SETS 子句中声明存储过程将要返回的结果集的数量(number-of-result-sets)。假如这里声明的返回结果集的数量小于存储过程中实际返回的结果集数量,在执行该存储过程的时候,DB2 会返回一个警告。使用WITH RETURN 子句,在存储过程体中声明游标。为结果集打开游标。当存储过程返回的时候,保持游标打开。在创建存储过程时指定返回结果集的个数可以帮助程序员验证存储过程是否返回了所期待数量的结果集,提高了程序的完整性。最佳实践2:对输入参数进行必要的的检查和预处理无论使用哪种编程语言,对输入参数的判定都是必须的。正确的参数验证是保证程序良好运行的前提。同样的,在DB2 中对输入参数的验证和处理也是很重要的。正确的验证和预处理操作包括:假如输入参数错误,存储过程应返回一个明确的值告诉客户应用,然后客户应用可以根据返回的值进行处理,或者向存储过程提交新的参数,或者去调用其他的程序。根据业务逻辑,对输入参数作一定的预处理,如大小写的转换,NULL 与空字符串或0 的转换等。在DB2 储存过程开发中,如需要碰到对空(NULL)进行初始化,我们可以使用COALESCE 函数。COALESCE函数返回第一个非空的参数,语法

如下:清单1:COALESCE 函数.---------------.

(1)V|

>>-COALESCE-------(--expression----,--expression-+--)---------->

SET piName= RTRIM(COALESCE(piName, ''));

SET piRank= COALESCE(piRank, 0);

-- make sure all required input parameters are not null

IF ( piNum IS NULL

OR piName = ''

OR piAge IS NULL )

THEN

SET poGenStatus = 34100;

RETURN poGenStatus;

END IF;

表Person中num、name和age都是非空字段。对于name字段,多个空格我们也认为是空值,所以在进行判定前我们调用RTRIM和COALESCE对其进行处理,然后使用piName = '',对其进行非空判定;对于Rank字段,我们希望假如用户输入的NULL,我们把它设置成"0",对其我们也使用COALESCE进行初始化;对于"Age"和"Num" 我们直接使用IS NULL进行非空判定就可以了。假如输入参数没有通过非空判定,我们就对输出参数poGenStatus设置一个确定的值(例子中为34100)告知调用者:输入参数错误。下面是对参数初始化规则的一个总结,供大家参考: 1. 输入参数为字符类型,且答应为空的,可以使用COALESCE(inputParameter,'')把NULL转换成''; 2. 输入类型为整型,且答应为空的,可以使用COALESCE(inputParameter,0),把空转换成0; 3. 输入参数为字符类型,且是非空非空格的,可以使用COALESCE(inputParameter,'')把NULL转换成'',然后判定函数返回值是否为'';

4. 输入类型为整型,且是非空的,不需要使用COALESCE函数,直接使用IS NULL进行非空判定。最佳实践3:正确设定游标的返回类型前面我们已经讨论了如何声明存储过程的返回结果集。这里我们讨论一下结果集返回类型的问题。结果集的返回类型有两种:调用者(CALLER) 和客户应用(CLIENT)。首先我们看一下声明这两种游标的例子:CREATE PROCEDURE getPeople(IN piAge INTEGER)

DYNAMIC RESULT SETS 2

READS SQL DATA

LANGUAGE SQL

BEGIN

DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR

SELECT name, age FROM person

WHERE age

DECLARE rs2 CURSOR WITH RETURN TO CALLER FOR

SELECT NAME, age FROM person

WHERE age>piAge;

OPEN rs1;

OPEN rs2;

END

代码中rs1游标的DECLAER语句中包含WITH RETURN TO CLIENT子句,表示结果集返回给客户应用(CLIENT)。rs2游标的DECLARE语句中包含WITH RETURN TO CALLER子句,表示结果集返回给调用者(CALLER)。游标返回给调用者(CALLER)表示由存储过程的调用者接收结果集,而不考虑调用者是否是另一个存储过程,还是客户应用。图(1)中存储过程PROZ 假如声明为WITH RETURN TO CALLER,那么结果集会返回给存储过程PROY,Client application 是不会得到PROZ返回的结果集的。图1:存储过程递归调用游标返回给客户应用(CLIENT)表示由发出最初CALL 语句的客户应用接收结果集,即使结果集由嵌套层次中的15 层深的嵌套存储过程发出也是如此。图1中存储过程PROZ 假如声明为WITH RETURN TO CLIENT,那么结果集会返回给Client Application。返回给客户应用(CLIENT)的游标声明是我们经常使用的,也是默认的结果集类型。在声明返回类型时,我们要认真考虑一下,我们需要把结果集返回给谁,以免丢失返回集,导致程序错误。最佳实践4:异常(condition)处理在存储过程执行的过程中,经常因为数据或者其他问题产生异常(condition)。根据业务逻辑,存储过程应该对异常进行相应处理或直接返回给调用者。此处暂且将condition译为异常以方便读者理解。实际上有些异常(condition)并非是由于错误引起的,下面将具体讲述。当存储过程中的语句返回的SQLSTATE值超过00000的时候,就表明在存储过程中产生了一个异常(condition),它表示出现了错误、数据没有找到或者出现了警告。为了响应和处理存储过程中出现的异常,我们必须在存储过程体中声明异常处理器(condition handler),它可以决定存储过程怎样响应一个或者多个已定义的异常或者预定义异常组。声明条件处理器的语法如下,它会位于变量声明和游标声明之后:上一页12345678910下一页清单4:声明异常处理器DECLARE handler-type HANDLER FOR condition handler-action异常处理器类型(handler-type)有以下几种:CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。UNDO 在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。假如产生了NOT FOUND 或者SQLWARNING 异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。假如产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。以下示例声明了两个异常处理器。EXIT 处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。清单5:异常处理器示例DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING

SET stmt = 'ABORTED';

DECLARE UNDO HANDLER FOR NOT FOUND; 上一页234567891011下一页假如预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:清单6:定制异常处理器DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注重在执行符合语句的时候,SQLSATE和SQLCODE 的值会被改变,假如需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。通常,我们会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。根据这个输出状态,可以表明存储过程是否正确执行完毕。我们需要定义一些异常处理器为这个输出参数赋值。下面是一个例子:清单7:定义为输出参数赋值的异常处理器-- Generic Handler

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND

BEGIN NOT ATOMIC

-- Capture SQLCODE & SQLSTATE

SELECT SQLCODE, SQLSTATE

INTO hSqlcode, hSqlstate

FROM SYSIBM.SYSDUMMY1;

-- Use the poGenStatus variable to tell the procedure -- what type of

error occurred

CASE hSqlstate

WHEN '02000' THEN

SET poGenStatus=5000;

WHEN '42724' THEN

SET poGenStatus=3;

ELSE

IF (hSqlCode < 0) THEN

SET poGenStatus=hSqlCode;

END IF;

END CASE;

END; 上一页3456789101112下一页上面的异常处理器会在出现SQLEXCEPTION, SQLWARNING, NOT FOUND异常的时候触发。异常处理器会取出当前的SQLCODE, SQLSTATE,然后根据它们的值来设置输出参数(poGenStatus)的值。我们还可以定制一些异常处理器。例如,我们可以定义一些对参数进行初始化的异常处理器。这里,异常处理器可以看作是一个供存储过程自己调用的内部函数。下面是这种情况的一个例子:清单8:供存储过程自己调用的内部函数-----------------------------------------------------

-- CONDITION declaration

-----------------------------------------------------

-- (80100~80199) SQLCODE & SQLSTATE

DECLARE sqlReset CONDITION for sqlstate '80100';

-----------------------------------------------------

-- EXCEPTION HANDLER declaration

-----------------------------------------------------

-- Handy Handler

DECLARE CONTINUE HANDLER FOR sqlReset

BEGIN NOT ATOMIC

SET hSqlcode= 0;

SET hSqlstate= '00000';

SET poGenStatus = 0;

END;

…………

-----------------------------------------------------

-- Procedure Body

-----------------------------------------------------

SIGNAL sqlreset;

-- insert the record

…………上一页456789101112下一页上面定制的异常处理器负责对参数hSqlcode,hSqlstate和poGenStatus初始化。当我们在程序中需要对它们初始化时,我们只需要调用SIGNAL sqlreset就可以了。最佳实践5:合理使用临时表我们在储存过程开发中经常使用临时表。合理的使用临时表可以简化程序的编写,提供执行效率,然而滥用临时表同样也会使得程序运行效率降低。临时表一般在如下情况下使用:1. 临时表用于存储程序运行中的临时数据。例如,假如在一个程序中第一条查询语句执行的结果会被后续的查询语句用到,那么我们可以把第一次查询的结果存储在一个临时表中供后续查询语句使用,而不是在后续查询语句中重新查询一次。假如第一条查询语句非常复杂和耗时,那么上面的策略是非常有效的。 2. 临时表可以用于存储在一个程序中需要返回多次的结果集。例如,程序中有一个很耗资源的多表查询,同时,该查询在程序中需要执行多次,那么就可以把第一次查询的结果集存储在临时保中,后续的查询只需要查临时表就可以了。 3. 临时表也可以用于让SQL访问非关系型数据库。例如,可以编写程序把非关系型数据库中的数据插入到一个全局临时表中,那么我们就可以对其数据进行查询。我们可使用DECLARE GLOBAL TEMPORARY TABLE 语句来定义临时表。DB2的临时表是基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现下面是定义临时表的一个示例:清单9:定义临时表DECLARE GLOBAL TEMPORARY TABLE gbl_temp

LIKE person

ON COMMIT DELETE ROWS

NOT LOGGED

IN usr_tbsp此语句创建一个名为gbl_temp 的用户临时表。定义此用户临时表所使用的列的名称和说明与person 的列的名称和说明完全相同。上一页56789101112下一页清单10:创建有两个字段的临时表DECLARE GLOBAL TEMPORARY TABLE session.TEMP2 (

ID INTEGER default 3,

NAME CHAR(30)

)

--WITH REPLACE

NOT LOGGED;

--IN USER_TEMP_01;此语句创建了一个有两个字段的临时表。理论上临时表是不需要显示DROP的,因为它是基于会话的,当临时表基于的连接关闭的时候,临时表也就

不存在了。但是在实际开发中会有一些情况需要我们对临时表加以注重。一种情况就是被调用的存储过程的返回值是一个基于临时表的结果集。当存储过程执行完毕的时候,临时表并不会消失,因为返回的结果集相当于一个指针,指向临时表所在的内存地址,此时临时表是不会被DROP掉的。这种情况下,既不能在存储过程中删除这个临时表,也不应该由客户应用显示的删除临时表,这就轻易出现一些问题。下面我们通过一个例子来说明这个问题。下面示例代码是返回临时表的存储过程(get_temp_table):清单11:返回临时表的存储过程-----------------------------------------------------

-- TEMPORARY TABLE & CURSOR declaration

-----------------------------------------------------

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP

(

ID INTEGER,

NAME CHAR(30)

)

--WITH REPLACE

NOT LOGGED;

P2: BEGIN

DECLARE R_CRSR CURSOR WITH RETURN TO CLIENT FOR

SELECT * FROM SESSION.TEMP

FOR READ ONLY;

INSERT INTO SESSION.TEMP VALUES(1,piName);

OPEN R_CRSR;

END P2;

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库

DB2 SQLJ 存储过程开发宝典,第 2 部分 简介: 在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。 引言 在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。 常见错误总结 由于程序代码本身、运行环境、参数配置等原因,SQLJ 存储过程在被调用时,可能会发生各种错误。对这些错误进行分析,明确其产生的原因,找到相应的应对措施,并加以归纳总结,对我们提高开发水平、保证产品质量和提高工作效率等方面具有重要的意义。这些信息对于 SQLJ 应用开发的初学者尤为重要,能够直接的帮助他们解决开发实际工作中遇到的问题,表 1 列出了常见的 SQLJ 存储过程运行错误,原因以及相应措施。 表 1. 常见错误 错误 原因 措施 SQL4306N Java 存储过程或用户定义的函数 名称(特定名称 特定名称)不能调用 Java 方法 方法,特征符为 字符串 DB2 通过 JAR 包名、类名、方法名和签名(Signature )无法找到创建存储过程时指定的被调用的方法。可能是引用的类不存在、jar 包没有安装、方法声明的参数列表与数据库期望的参数列表不匹配或者不是“public”实例方法 1.查看 Java 代码中的方法名和类名,检查存储过程 DDL 中 Java 方法名、类名和 jar 包名是否有误; 2.检查 jar/calss 文件是否在指定位置,如 sqllib/function 目录下; 3.检查存储过程 DDL 中的方法参数列表是否与 Java 代码匹配(使用 javap – s class_id 可以查看类中方法的签名),并且 Java 代码中该方法是 public 的。 SQL4304N Java 存储过程或用户定义的函数 名称(特定名称 特定名称)不能装入 Java 类 类,原因码为 原因码。 1. RC=1:在 CLASSPATH 上找不到该类。往往可能是我们在 DDL 发生了拼写错误; 2. RC=2:该类未实现必需的接口 COM.ibm.db2.app.StoredProc 或缺少 public 访问权标志。如果是 PARAMETER STYLE DB2GENERAL 的存储过程,那么要求被调用 Java 类是 public 的并继承了接口 COM.ibm.db2.app.StoredProc 。 1.检查 Java 代码中的类 / 方法名和存储过程 DDL 中 Java 类 / 方法名是否一致; 2.检查 jar/calss 文件是否在 CLASSPATH 中,如 sqllib/function 目录下; 3.检查是否 DDL 指定了 PARAMETER STYLE DB2GENERAL 而 Java 代码类是否是 public 并继承 接口 COM.ibm.db2.app.StoredProc 。 SQL4302N 过程或用户定义的函数 名称(特定名称 特定名称)由于异常 字符串 而 存储过程由于异常而异常终止。通常可能是查询返回是空的 数据集,或是 SQL 中使用“select into :hostvar”但是实际查 询返回多条数据,或 Java 运行中出现空指针异常等。 检查 db2diag.log 诊断日志,找到错误,修正 Java 代码。

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.doczj.com/doc/f110939053.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

DB2存储过程快速入门.

1.1 SQL过程的结构 命名规则: 1、清洗过程名称命名: PROC_业务主题_目标表(PROC_JY_KJYRLJB 交易主题的卡交易日类聚表) 2、函数名称命名: PROC_业务主题_函数名(PROC_JY_GETYWZL 交易主题取得卡业务种类函数) 3、变量命名: VAR_变量描述(VAR_YWZL 业务种类变量) 4、游标命名: CUR_游标描述(CUR_KJYB 对卡交易表进行游标处理) 语法: CREATE PROCEDURE 过程名称 (参数列表 DYNAMIC RESULT SETS 结果集数量 是否允许SQL LANGUAGE SQL BEGIN SQL 过程体

END 范例“资产负债.sql ”中 第1行:Create Procedure admin.BalanceSheetDayly定义了过程名称 参数列表为Out ProcState varchar(100 其定义SQL 过程从客户应用获取,或返回客户应用的0个或多个参数,参数列表使用逗号侵害各个参数 参数类型有三种: l IN 从客户应用检索值。其不能够在SQL 过程体中修改 l OUT 向客户应用返回值 l INOUT 从客户应用检索值,并返回值 省略了结果集数量的定义,default 为0。即表示不返回结果集。 省略了是否允许SQL 的说明。其值指出了存储过程是否会使用SQL 语句,如果使用,其类型如何: l NO SQL 不能够执行任何SQL 语句 l COTAINS SQL 可以执行不会读取SQL 数据,也不会修改SQL 数据的SQL 语句 l READS SQL DATA 可以包含不会修改SQL 数据的SQL 语句 l MODIFIES SQL DATA 可以执行任何SQL 语句,除了不能够在存储过程中支持的语句以外。

DB2数据库日常维护-REORG_TABLE

转)DB2日常维护——REORG TABLE命令优化数据库性能 2009-04-24 16:18 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常、安全、高效运行,防止一些错误重复发生。 由于DB2使用CBO作为数据库的优化器,数据库对象的状态信息对数据库使用合理的 ACCESS PLAN至关重要。DB2 优化器使用目录统计信息来确定任何给定查询的最佳访问方案。如果有关表或索引的统计信息已过时或者不完整,则会导致优化器选择不是最佳的方案,并且会降低执行查询的速度。当数据库里某个表中的记录变化量很大时,需要在表上做REORG操作来优化数据库性能 一、完整的REORG表的过程 值得注意的是,针对数据库对象的大量操作,如反复地删除表,存储过程,会引起系统表中数据的频繁改变,在这种情况下,也要考虑对系统表进行REORG 操作。一个完整的REORG表的过程应该是由下面的步骤组成的: RUNSTATS -> REORGCHK -> REORG -> RUNSTATS -> BIND或REBIND 注:执行下面命令前要先连接数据库 1 RUNSTATS 由于在第二步中REORGCHK时可以对指定的表进行RUNSTATS操作(在REORGCHK时指定UPDATE STATISTICS),所以第一步事实上是可以省略的。 2 REORGCHK 在对表数据进行许多更改之后,逻辑上连续的数据可能会位于不连续的物理数据页上,在许多插入操作创建了溢出记录时尤其如此。按这种方式组织数据时,数据库管理器必须执行其他读操作才能访问顺序数据。另外,在删除大量行后,也需要执行其他的读操作。 表重组操作会整理数据碎片来减少浪费的空间,并对行进行重新排序以合并溢出记录,从而加快数据访问速度并最终提高查询性能。还可以指定根据特定索引来重新排序数据,以便查询时通过最少次数据读取操作就可以访问数据。 下列任何因素都可能指示用户应该重组表: 1)自上次重组表之后,对该表进行了大量的插入、更新和删除活动。

DB2 MDC 表的优化策略

DB2 MDC 表的优化策略 如果创建多维集群 (MDC) 表,那么可以提高许多查询的性能,这是因为优化器可 以应用附加的优化策略。这些策略主要依赖于块索引效率有所提高,但根据多个维进行集群这一优点还能提高数据检索速度。 MDC 表优化策略还可以利用分区内并行性和分区间并行性的性能优点。请考虑MDC 表的下列具体优点: ?维块索引查找操作可以标识表的所需部分,并且能够快速地仅扫描所需的块。 ?因为块索引小于记录标识(RID)索引,所以查找速度更快。 ?可以在块级别执行索引 AND 和 OR 运算,并可以将这些运算与 RID 相结合。 ?保证在扩展数据块内集群数据,这有助于提高检索速度。 ?如果可以使用转出方法,那么删除行的速度将更快。 请考虑名为 SALES 的 MDC 表的以下简单示例,这个表对 REGION 和 MONTH 列 定义了维: select * from sales where month = 'March' and region = 'SE' 对于此查询,优化器可以执行维块索引查找操作,以寻找月份为三月且地区为 SE 的块。然后,它可以只扫描那些块,以便快速地访存结果集。 转出删除 当条件允许使用转出方法来进行删除时,将使用这种从 MDC 表中删除行的更高效 方法。必需的条件包括: ?该 DELETE 语句是搜索型 DELETE,而不是定位型 DELETE(该语句不使用 WHERE CURRENT OF 子句)。 ?没有 WHERE 子句(将删除所有行),或者 WHERE 子句只包含应用于维的条件。 ?定义表时,未指定 DATA CAPTURE CHANGES 子句。 ?该表不是引用完整性关系中的父表。 ?未对该表定义 ON DELETE 触发器。 ?未在任何立即刷新的 MQT 中使用该表。 ?如果级联删除操作的外键是该表的维列的子集,那么它可能适合于转出。 ?在由 CREATE TRIGGER 语句的 OLD TABLE AS 子句指定的触发 SQL 操作之前,该 DELETE 语句不能出现在对临时表执行并标识了受影响行集的 SELECT 语句中。

DB2存储过程使用动态游标的例子

本文将为您介绍一个DB2存储过程使用动态游标的例子,如果您对动态游标的使用感兴趣的话,不妨一看,对您学习DB2的使用会有所帮助。 CREATE PROCEDURE data_wtptest( IN in_taskid_timestamp varchar(30), OUT o_err_no int, OUT o_err_msg varchar(1024)) LANGUAGE SQL P1: BEGIN ATOMIC --声明开始 --临时变量出错变量 DECLARE SQLCODE integer default 0; DECLARE SQLStmt varchar(1024) default ''; DECLARE r_code integer default 0; DECLARE state varchar(1024) default 'AAA';--记录程序当前所作工作 DECLARE at_end int DEFAULT 0; DECLARE t_destnetid int default 0; DECLARE t_recvid varchar(30) default ''; DECLARE SP_Name varchar(50) default 'data_wtptest'; --声明放游标的值 --声明动态游标存储变量 DECLARE stmt1 STATEMENT; DECLARE c1 CURSOR FOR stmt1; --声明出错处理 DECLARE EXIT HANDLER FOR SQLEXCEPTION begin set r_code=SQLCODE; set o_err_no=1; set o_err_msg='处理['||state||']出错,'||'错误代码SQLCODE:['||CHAR(r_code) || '].'; insert into fcc_sp_log(object,name,value) values(SP_Name,in_taskid_timestamp,o_err_msg); end; DECLARE continue HANDLER for not found begin

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

db2数据库性能参数优化笔记整理

[经验分享] db2数据库性能参数优化笔记整理 数据库, 笔记, 性能, 参数, 调优 1、Application Support Layer Heap Size (ASLHEAPSZ) 它是app和agent通信的buffer,占用实例共享内存空间。 监控: get snapshot for all on | grep –i “Rejected Block Remote Cursor requests” Rejected Block Remote Cursor requests = 2283 如果Rejected Block Remote Cursor requests值比较高,增大ASLHEAPSZ值,直到该值为0 配置: update dbm cfg using aslheapsz 20 2、Maximum Requester I/O Block Size (RQRIOBLK) 它是client和server通信的buffer,占用每个agent的私有内存空间。 监控:无法监控 配置:建议设置为最大值64K,缺省32767bytes,(设到最大值不会影响其它性能) update dbm cfg using rqrioblk 65536 3、Sort Heap Threshold (SHEAPTHRES) 私有模式排序空间最大阀值,值=并发数×SORTHEAP 监控: 需要打开sort监控开关-db2 update monitor switches using sort on get snapshot for dbm | grep –i “sort” 如果Post threshold sorts值比较大,增加SORTHEAP 、SHEAPTHRES参数值 如果(Piped sorts accepted/Piped sorts requested)值比较低,增加SORTHEAP 、SHEAPTHRES参数值配置: update dbm cfg using sheapthres 80000 4、Enable Intra-Partition Parallelism (INTRA_PARALLEL) 在SMP环境中打开该选项,提高表和索引扫描速度 监控: list applications 看application对应的Agents(# of Agents)数目是否大于1 配置: update dbm cfg using intra_parallel yes 5、Maximum Query Degree of Parallelism (MAX_QUERYDEGREE)

db2回滚处理问题

db2回滚处理问题 DB2处理器对于存储过程来说,有着不可替代的作用。在DB2中,SQL存储过程可以利用DB2处理器(Condition Handler)来处理存储过程运行过程中的SQL错误(SQLERROR)、SQL警告(SQLWARNING)和没有数据(NOT FOUND)三种常见情况以及你自己定义的触发,你可以使用包括退出(EXIT)、继续(CONTINUE)和撤销(UNDO)在内的三种处理器。 在SQL存储过程运行过程中,如果出现了SQLERROR、SQLWARNING和NOT FOUND 三种情况,SQL存储过程将会自动将执行SQL语句后的SQLCODE和SQLSTATE存储在你事先定义好的变量SQLCODE和SQLSTATE中,并触发你在存储过程中定义的处理器。 在SQL存储过程处理错误,您需要做如下两步:声明SQLCODE和SQLSTATE 变量、定义处理器。在SQL存储过程中,您通过下列语句声明SQLCODE和SQLSTATE 变量: DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE SQLSTATE CHAR(5) DEFAULT ‘00000’; 当存储过程执行时,DB2会自动将该SQL语句的返回码付给这两个变量,你可以在调试程序的时候,将这两个值插入到调试表中,或者利用处理器将这两个值返回给调用者。这样可以方便SQL存储过程的调试。注意:当你在SQL存储过程中存取SQLCODE和SQLSTATE时,DB2会自动将SQLCODE和SQLSTATE置为零。 可以通过下列语句定义DB2处理器: DECLARE handler-type HANDLER FOR condition SQL-procedure-statement 其中handler-type可以是如下几种: CONTINUE:SQL存储过程在执行完处理器中的SQL语句后,继续执行出错SQL 语句后边的SQL语句。 EXIT: SQL存储过程在执行完处理器中的SQL语句后,退出存储过程的执行。 UNDO:这种处理器仅限于原子动作(ATOMIC)复合SQL语句,SQL存储过程将会回滚包含该处理器的复合SQL语句,并在执行完该处理器中的SQL语句后,继续执行原子动作(ATOMIC)复合SQL语句后面的SQL语句。 包括如下三种常见情况: SQLEXCEPTION:在SQL执行过程中返回任何负值。 SQLWARNING:在SQL执行过程中出现警告(SQLWARN0为‘W’),或者是任何不是+100的正的SQL返回值,相应的SQLSTATE以‘01’开始。 NOT FOUND:SQL返回值为+100或者SQLSTATE以‘02’开始。 当然你也可以使用DECLARE语句为特定的SQLSATE定义你自己的。

SQL存储过程实例

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。 2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 建表语句

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) , --id XXLY VARCHAR(100), --信息来源 LXDH VARCHAR(32 ), --信息来源联系电话 FKRQ DATE --反馈时间 ) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED; ----字符串函数

DB2存储过程简单例子

DB2存储过程简单例子 客户在进行短信服务这个业务申请时,需要填写一些基本信息,然后根据这些信息判断这个用户是否已经存在于业务系统中。因为网上服务和业务系统两个项目物理隔离,而且网上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。 解决方式是通过存储过程,以前也了解过存储过程,但没使用到项目中。不过经过一番努力最后还是完成了,期间遇到了一些困难,特写此文让对DB2存储过程还不熟悉的童鞋避免一些无谓的错误。 DROP PROCEDURE "PLName" @ CREATE PROCEDURE "PLName"(--存储过程名字 IN IN_ID BIGINT , --以下全是输入参数 IN IN_ENTNAME VARCHAR(200) , IN IN_REGNO VARCHAR(50), IN IN_PASSWORD VARCHAR(20), IN IN_LEREP VARCHAR(300), IN IN_CERTYPE CHARACTER(1), IN IN_CERNO VARCHAR(50), IN IN_LINKMAN VARCHAR(50), IN IN_SEX CHARACTER(1), IN IN_MOBTEL VARCHAR(30), IN IN_REQDATE TIMESTAMP, IN IN_REMITEM VARCHAR(300), IN IN_STATE CHARACTER(1), IN IN_TIMESTAMP TIMESTAMP ) BEGIN declare V_RESULT BIGINT; --声明变量 DELETE FROM TableNameA WHERE ID = IN_ID;

DB2数据库优化

关于数据库优化有很多方法,这里针对数据库的runstat(运行统计)和reorg(重组)进行以下说明; 一、runstats: 1、runstats的作用: 一个SQL在写完并运行之后,其实我们只是告诉了DB2去做什么,而不是如何去做。而,具体的如何去做,就取决于优化器。优化器为了生成最优的执行计划,就得掌握当前的系统信息,目录中的统计信息等等。 runstats命令就是用来收集数据库对象的状态信息,这对优化器生成最优的执行计划至关重要。 2、什么时候需要runstats: 在给表创建一个index后,我们最好做一次runstat,否则可能index没有生效。不过有说法称在8.2版本以后的DB2中,会在INDEX之后自动进行runstats; 在对table做了一次reorg后,记得要做一次runstats。因为对表做reorg,会修改表的很多信息,比如高水位等,所以做一次runstats,可以更新统计信息。 当表里数据发生了比较大的变化,一般来说,大约表里面的数据量的10%-20%发生了变化,就应该作一次runstats。这些变化包括删除,修改,插入。对于一些非常大的表,比方在某些医院,出院明细账表非常巨大。这个时候,完整的对一个大表做runstats可能花费时间相当大,需要提前做好准备; 3、runstats的语法: runstats on table [模式名].[表名] with distribution and detailed indexes all 你可以在所有列上,或者仅仅在某些列或列组(除了LONG和LOB列)上执行RUNSTA TS。如果没有指定特定列的子句,系统则会使用默认的ON ALL COLUMNS子句。 使用RUNSTA TS WITH DISTRIBUTION 当您已确定表中包含不是统一分布的数据时,可以运行包含WITH DISTRIBUTION子句的RUNSTA TS。目录统计信息表通常包含关于表中最高和最低值的信息,而优化器假定数据值是在两个端点值之间均匀分布的。然而,如果数据值彼此之间差异较大,或者群集在某些点上,或者是碰到许多重复的数据值,那么优化器就无法选择一个最佳的访问路径,除非收集了分布统计信息。使用WITH DISTRIBUTION子句还可以帮助查询处理没有参数标志符(parameter marker)或主机变量的谓词,因为优化器仍然不知道运行时的值是有许多行,还是只有少数行。 如果为单一索引进行runstats,可以使用: runstats on table [模式名].[表名] for indexes [索引名] 4、图像界面下runstats; 首先在维护机上编目需要优化的的数据库; 连接数据库; 找到需要做runstats的表,右键,选择运行统计信息;

MySQL存储过程实例教程2

MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。 2.关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。 3.MySQL存储过程的创建 (1). 格式

db2对缓冲池的性能优化

db2 对缓冲池的性能优化 博客分类: DB2 db2 对缓冲池的性能优化 需求:因为项目开始的时候没有对DB2数据库进行深入的熟悉,所以造成项目后期做性能测试的时候,导致应用访问过慢,后来决定从数据方面做做一下性能优化,主要在于缓冲池方面。 解决方案:因为数据库中只有一个常规表空间表空间USERSPACE1和一个缓冲池 IBMDEFAULTDP(1G),所以决定重新再建一个大的缓冲池BP2,将USERSPACE1赋给BP2 CREATE BUFFERPOOL BP2 SIZE 2048 PAGESIZE 4K; ALTER TABLESPACE USERSPACE1 BUFFERPOOL BP2; 附注: 以下为对网上资源学习后的一个总结: 1、表空间 I、数据存储层级关系:数据库-->表空间-->容器-->表, II、表空间分类: 目录表空间 特性:每个数据库只有一个目录表空间,它是在发出CREATE DATABASE 命令时创建的. 目录表空间被DB2 命名为SYSCATSPACE, 用途:它保存了系统目录表; 常规表空间

特性:创建数据库时指定该表空间的缺省名为USERSPACE1。长表空间是可选的,缺省情况下一个都不创建, 用途:保存表数据和索引、还可以保存LOB之类的长数据; 系统临时表空间 特性:随数据库创建的系统临时表空间的缺省名为TEMPSPACE1, 用途:用于存储SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据; 以上是由系统管理的空间(SMS),必须有一个 以下是由数据库管理的空间(DMS),可选 长表空间 用途:用于存储长型或LOB 表列,存储结构化类型的列或索引数据 用户临时表空间 用途:存储已声明的全局临时表 LOB(large object)的定义: 是一种用于存储大对象的数据类型,如医学记录(如X-射线)、视频、图像等。LOB有三种类型:BLOB:Binary Large Object、 CLOB:Character Large Object、DBCLOB:Double-byte Character Large Object。每个LOB可以有2GB III、页大小(暂无): IIII、创建表空间: 最有效的表空间设置属性:PAGESIZE(表空间大小)、EXTENTSIZE(将数据写入到下一个容器之前写入到当前容器中的数据的页数)和PREFETCHSIZE(预取)

存储过程实例精选

整理者为我 实例1:只返回单一记录集的存储过程。 银行存款表(bankMoney)的内容如下 要求1:查询表bankMoney的内容的存储过程 create procedure sp_query_bankMoney as select * from bankMoney go exec sp_query_bankMoney 注* 在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧! 实例2(向存储过程中传递参数): 加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。 Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output with encryption ---------加密 as insert bankMoney (id,userID,sex,Money)

Values(@param1,@param2,@param3, @param4) select @param5=sum(Money) from bankMoney where userID='Zhangsan' go 在SQL Server查询分析器中执行该存储过程的方法是: declare @total_price int exec insert_bank '004','Zhangsan','男',100,@total_price output print '总余额为'+convert(varchar,@total_price) go 在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容): 1.以Return传回整数 2.以output格式传回参数 3.Recordset 传回值的区别: output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。 实例3:使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。 USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = 'au_info_all' AND type = 'P') DROP PROCEDURE au_info_all GO

DB2数据库性能优化

DB2数据库性能优化 DB2问世于1983年,其被贴上的标签之一就是:最早使用SQL(同样最早被IBM 开发)的关系型数据库产品。此前,IBM已经有了一个层次性数据库产品,在当时已属数据库中的"大哥大",所以当发布关系型数据库时,IBM为自己的数据库产品排座次,新的数据库产品理所当然的是数据库二代,也被大家戏称为"库二代",就这样,DB2的命名也就被人们接受了。实际上,DB2的渊源可以追溯至上世纪70年代初,那时还是个登月的年代,阿波罗登月的壮举时刻激励科学家们开拓创新。当时在IBM工作的考德(E.F.Codd)博士在1970年6月用划时代的论文描述了关系型数据库理论,这使得后来诞生的"库二代"被赋予了强有力的数学基础和逻辑基因。接下来,IBM把对E.F.Codd想法的实施交给了一个程序小组,这个程序小组使用SEQUEL作为查询语言。当IBM公布其第一个关系型数据库产品时,对SEQUEL重新命名,这就是后来大名鼎鼎的SQL。而在那一段时间,刚遭受离婚重创的犹太人Larry Ellision也发现了其中的秘密,他创立的Oracle,着实与DB2经历了一起"穿开裆裤"的起步阶段,之后你追我干30年,成为一组最有趣的竞争对手。 在上世纪80年代,DB2作为一个全功能的数据库管理系统,被IBM大型机所专用。到了上世纪90年代早期,IBM将DB2带向了其它平台,包括OS/2、UNIX以及Windows服务器,然后是Linux和手持设备。让大家一目了然的是,DB2 所有的产品都要被命名为"产品 for 平台"(例如,DB2 for OS/390)。 进入上世纪90年代中期,IBM发布了一组最初应用在AIX上的被称为DB2 Parallel的版本,此版本通过无分享(Share Nothing)架构而提供更强的伸缩性,即将一个大型数据库,分布到多个服务器上。后来,这个DB2版本被扩展到所有的Linux、UNIX以及Windows平台,并被重新命名为DB2 Extended Enterprise Edition(EEE)。现在,这个特性被称为Database Partitioning Feature(DPF)。目前,DPF在数据仓库中已得到了广泛应用。 DB2有众多的版本,除了支持OLTP的Express、Workgroup和Enterprise等版本外,还提供了支持数据仓库的版本,Infosphere Wareshouse(缩写为ISW)。这个版本偏重于混合工作负荷(OLTP和OLAP)和商业智能的实现,包含一些商务智能的特性例如ETL工具、数据发掘、OLAP加速等。 DB2 V10是最近发布的版本。这个版本提供了多时态表(Temporal Tables)、多表星型连接、行列访问控制(RCAC)、多温度存储(Multi-temperature Storage)等特性;在DB2 V10中,通过自适应压缩(Adaptive Compression)特性大幅度提升了压缩比;DB2集群技术(pureScale)得到进一步的完善。 本课程循序渐进,由浅入深,从DB2基础讲起,再深入讲授性能调优方法学和核心技能,最后会分享培训老师在一线多年的实战案例。内容包括:DB2优化方法系统、数据库监控、配置参数调整、日志优化、运维工具优化、锁机制、索引调优、优化器与SQL语句调优等。另外,最最重要的是本课程包含众多一线实战案例,包括某ERP数据库性能优化、某数据采集平台数据库性能优化等。

相关主题
文本预览
相关文档 最新文档