一. 使用存储过程的好处

  1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间

      应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起,

    从而使得对于每一组SQL语句只需要跨网络两次。存储过程中集中在一起的SQL语句越多,

    网络的使用率和数据库锁定保持的时间就越低。通过减少网络使用率和数据库锁定的时间长短,

    就可以提高网络的总体性能并减少锁定争用问题。

二. 用于存储过程的语言

  在DB2的"开发中心",可以用Java或SQL来创建存储过程。

三. SQL存储过程

  1. 使用SQL过程语言来编写存储过程具有下列优点:

    a. 可以通过在"开发中心"中使用集成调试器来调试SQL存储过程

    b. 借助SQL存储过程,可以调用其它SQL过程,最多可以嵌套16层调用

    c. SQL存储过程运行速度快,因为它是作为已编译的例程来运行的

  2. SQL存储过程具有大小和参数限制,这取决于正在运行的DB2版本:

    a. 对于DB2 Windows版和UNIX版,在版本7和版本8中,SQL存储过程的最大大小是64KB

四. Java存储过程

   1. 使用Java语言来编写存储过程具有下列优点:

    a. 在Java的安全性限制之内,可以使用Java存储过程进行文件的输入/输出。SQL存储过程不支持

      文件的输入/输出。

五. 存储过程的基本语法 

create procedure db2Inst.proce1(
in "inParam" integer,
out "outParam" varchar(10)
)
specific "proce1"
language sql
dynamic result sets 1
not deterministic
external action
modifies sql data
old savepoint level begin
L1: begin
/*变量定义*/
declare inum integer default 0; /*变量赋值*/
set inum = 20; /*分支语句*/
if 条件1 then
...
elseif 条件2 then
...
else
...
end if; /*多分支语句case*/
case 变量名
when 变量值1 then
...
when 变量值2 then
...
else
...
end case; /*for循环*/
for 变量名 as 游标名或select 表达式
do
...
end for; /*while循环*/
while 条件表达式 do
...
end while; /*loop语句*/
insLoop:
loop
...
leave insLoop;/*中断循环*/
iterate insLoop;/*下一个循环*/
end loop; /*游标的使用方式一*/
/*定义游标*/
declare 游标名 cursor for select 语句;
/*打开游标*/
open 游标名;
/*取值*/
fetch 游标名 into 变量列表;
/*关闭游标*/
close 游标名; /*goto语句*/
goto fail;
...
success: return 0
fail: return -200 end L1; /*游标的使用方式二*/
/*游标的定义如果放在中间段,要用"begin...end;"段分割标志分割开*/
L2: begin
declare v_notfound integer default 0;
declare stmt statement;/*声明放游标的值 */
declare cur cursor with return for stmt;/*声明动态游标存储变量*/
declare continue handler for not found set v_notfound = 1; prepare stmt from qrySql;
open cur;
fetch cur into 变量列表;
close cur;
end L2; /*临时表*/
L3: begin
/*定义临时表*/
declare global temporary table session.tableName(
columnName integer
)
not logged with replace;/*不记录日志,没有则替换*/
/*操作临时表*/
insert into session.tableName values(columnValue);
end L3; /*取得行号*/
select rownumber() over() as rownum from tableName; /*解决like后跟一个字段*/
select * from table1 a
left join table2 b on locate(a.columnName,b.columnName)>0; end

六. 存储过程属性说明

procedureName:存储过程的名字,在同一个数据库的同一模式下,不能存在
存储过程名相同,参数数目相同的存储过程,即使参数的类型不同也不行 (in|out|inout paramName dataType, ...):传入参数
in:输入参数,out:输出参数,inout:作为输入输出参数
dataType:参数类型,可以接收SQL类型和创建的表,不支持long varchar,
long vargraphic,datalink,reference和用户自定义类型。 specific specificName:唯一的特定名称(别名),可以用存储过程名代替。
用于给存储过程添加注释用,但不能调用存储过程。如果不指定,则数据库
会自动生成一个yymmddhhmmsshhn时间戳的名字。 language sql:指定过程的主体用的是SQL语言 dynamic result sets integer:指定存储过程返回结果的最大数量,若小于实际返回数量,则db2返回警告 deterministic or not deterministic:表示存储过程是动态或者非动态的。
动态的返回的值是不确定的,非动态每次返回值都是相同的 external action or no external action:表示存储过程是否执行改变数据库状态的活动,
而不通过数据库管理器。默认是external action。如果指定为no external action,
则数据库会确定最佳优化方案。 contains sql, reads sql data, modifies sql data:指定存储过程中的SQL访问级别
contains sql:表示存储过程可以执行中,既不可读取SQL数据,也不可修改SQL数据。
reads sql data:表示存储过程可以执行中,可读取SQL,但不可修改SQL数据。
modifies sql data:表示存储过程可以执行任何SQL语句。可以对数据库中的数据进行
增加、删除和修改。 old savepoint level or new savepoint level:建立存储点(存储某个时候的数据),
old savepoint level是默认的存储点 called on null input:表示可以调用存储过程而不管任何的输入参数是否为NULL,并且,
任何的out或者inout参数可以返回一个NULL或者非空值。检验参数是否为NULL是在过程中进行的。 inherit special registers:表示继承专用寄存器 parameter ccsid:指定所有输出字符串数据的编码,默认为unicode编码数据库为:parameter ccsid unicode,
其他的数据库默认为:parameter ccsid 3 ascii

七. 存储过程调用另一存储过程,返回结果集

  1. 存储过程1:返回2个结果集

create procedure db2Inst.proc1()
language sql
result sets 2 P1:begin
declare c1 cursor with return to caller for select语句;
declare c2 cursor with return to caller for select语句; open c1;
open c2; ...
end P1

  2. 存储过程2:调用存储过程1,取得2个结果集

create procedure db2Inst.proc2()
language sql P1:begin
/*建立一个结果集数组*/
declare loc1,loc2 result_set_locator varying;
/*调用存储过程1,返回结果集*/
call proc1;
/*将返回结果集和结果集数组关联*/
associate result set locator(loc1,loc2) with procedure proc1;
/*将结果集数组进行分配*/
allocate cursor1 cursor for result set loc1;
allocate cursor2 cursor for result set loc2; /*直接从结果集中取值*/
fetch cursor1 into 变量列表;
close cursor1; ...
end P1

八. 结果集的返回类型  

create procedure db2Inst.proc3()
language sql
dynamic result sets 2
reads sql data begin
declare rs1 cursor with return to client for select语句;
declare rs2 cursor with return to caller for select语句;
open rs1;
open rs2;
end

  1. with return to client:表示由发出最初call语句的客户应用接收结果集,即使结果集由嵌套层次中的

    15层深的嵌套存储过程发出也是如此。

  2. with return to caller:表示由存储过程的调用者接收结果集,而不考虑调用者是否是另一个存储过程,

    还是客户应用。

九. 异常处理

  1. 声明异常处理器的语法如下,它会位于变量声明和游标声明之后:

    declare handlerType handler for condition

  2. handlerType异常处理器类型有以下几种:

    a. continue:在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句

    b. exit:在处理器操作完成之后,存储过程会终止,并将控制返回给调用者

    c. undo:在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作

      完成之后,存储过程会终止,并将控制返回给调用者。

  3. 异常的种类(condition)

    异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。

    预定义的3种异常:

      a. not found:标识导致SQLCODE值为+100或者SQLSTATE值为0200的异常。

        这个异常通常在select没有返回行的时候出现。

      b. sqlexception:标识导致SQLCODE值为负的异常

      c. sqlwarning:标识导致警告异常或者导致+100以外的SQLCODE正值的异常

  4. 异常处理器示例

    declare exit handler for sqlexception, sqlwarning set stmt = "aborted";

    declare undo handler for not found;

db2存储过程的更多相关文章

  1. DB2 存储过程创建、系统表

    前段时间做了数据表拆分,进行数据迁移,用到一些SQL命令,语句记录下来 db2look是DB2用于生成数据库DDL语句的一个工具: 命令:db2look -d DBname -a -e -p -i u ...

  2. DB2存储过程语法规则

    如何声明一个存储过程CREATE PROCEDURE 存储过程名(IN 输入变量名 输入变量类型,OUT 输出变量名 输出变量类型)紧跟其后的是存储过程属性列表            常用的有:LAN ...

  3. linux命令行执行db2存储过程

    存储过程代码如下: CREATE PROCEDURE proc_sum2(IN n INT,OUT sum INT,OUT j INT) BEGIN DECLARE i INT; ; ; ; WHIL ...

  4. db2 存储过程迁移方法

    大家在迁移数据库时,存储过程一般也要迁移过去,但一般有两个问题: 1. 非常多存储过程有先后关系(存储过程调用存储过程),假设存储过程数量少,还能手动操作.假设量大,那真是要疯了. 2. 存储过程过大 ...

  5. 通过DbVisualizer 工具运行DB2存储过程实现INSERT语句主键自增造数

    1.需求简介 最近开发人员需要进行一批数据进行生产上SQL语句耗时过长问题的验证与优化.所以在性能测试库中批量建造数据,由于交易本身业务逻辑过于复杂以及需要各种授权,最后决定采用插表的方式完成. 2. ...

  6. db2存储过程迁移

    一.导出存储过程 EXPORT TO D:/PROCUDURE/procudure.del OF del MODIFIED BY LOBSINFILE SELECT 'SET CURRENT SCHE ...

  7. db2 存储过程参数传递--字段类型转换产生的问题

    修改之前的脚本 select count(*) from dbdk.dtdkg010 A left join DBDK.DTDKG070 D ON D.PAY_NO = A.PAY_NO LEFT J ...

  8. 怎样提高DB2存储过程性能

    高性能的SQL过程是数据库开发人员所追求的,我将不断把学到的,或在实际开发中用到的一些提高SQL过程性能的技巧整理出来,温故而知新. 1,在只使用一条语句即可做到时避免使用多条语句 让我们从一个简单的 ...

  9. db2 -- 存储过程01

    接下来项目在技能可能偏向数据库方面,补习下. 学习写第一个db2在存储过程,记录下. ---- stored procedures code CREATE OR REPLACE PROCEDURE & ...

随机推荐

  1. Java关键字用法及区别

    abstract 修饰词表明类或者成员方法具有抽象属性, 用于修饰类时 该类为抽象类 用于方法前 该方法为抽象方法. assert 用来进行程序调试 断言预判的意思. boolean 基本数据类型之一 ...

  2. 【Linux_Fedora_应用系列】_2_如何安装视频播放器和视频文件解码

    在前面的一篇博文中,我们进行了音乐播放器的安装和解码器的安装.[Linux_Fedora_应用系列]_1_如何安装音乐播放器和mp3解码 这里我们来进行视频播放器的安装.我们还是通过yum方式安装. ...

  3. 第 13 章 CSS 选择器[上]

    学习要点: 1.选择器总汇 2.基本选择器 3.复合选择器 4.伪元素选择器 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 选择器,通过选择器定位到想要设置样式的元素.目前 CSS 选择器的 ...

  4. Lucene(01)

    我的博客园博文地址:http://www.cnblogs.com/tenglongwentian/ Lucene,最新版是Lucene6.2.1,匹配的jdk版本是1.8正式版.这里用jdk7最后一版 ...

  5. rabbitmq启动异常之error,{not_a_dets_file recovery.dets

    中午,公司群里面测试人员@笔者说,早上测试服务器异常,MQ起不来,重启os了也起不来,报错,上去看下了早上又因为内存oom被内核killed了,启动了下,确实启动报错,erl vm进程起来了,但是be ...

  6. HTML(.js) – 最简单的方式操作 DOM 的 JS 库

    HTML(.js) 是一个轻量的(压缩后~2kb) JavaScript 库,简化了与 DOM 交互的方法. 这个 JavaScript 库的方法可读性很好,并具有搜索和遍历 DOM 的方法.相比 j ...

  7. 【初探移动前端开发05】jQuery Mobile (整合版)

    前言 为了方便大家看的方便,我这里将这几天的东西整合一下发出. 里面的例子请使用手机浏览器查看. 什么是jQuery Mobile? jquery mobile是jquery在移动设备上的版本,他是基 ...

  8. 完美卸载oracle11g步骤

    完美卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraHome ...

  9. MySql基本概念(一)

    MySQL基本概念 一. 数据库系统概述: mysql是数据库系统的一种,下面是所有数据库系统中主要的组件. 数据库系统由硬件部分和软件部分构成,硬件主要用于存储数据库中的数据,包括计算机.存储设备. ...

  10. Office 365 – SharePoint 2013 Online 之WebPart开发、部署教程

    1.打开Visual Studio,新建一个项目,选择SharePoint空项目,如下图: 2.选择调试站点和沙盒解决方案,如下图: 3.在项目中,添加一个WebPart,如下图: 4.添加完毕的项目 ...