注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 IB客座主编(四)美国西蒙公..
 帮助

DB2纯SQL存储过程入门实践


2006-12-19 17:55:24
 标签:DB2 SQL 存储过程   [推送到技术圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
DB2纯SQL存储过程入门实践
 
 
背景本人现在在DB2 9.1做Birt应用,需用写纯SQL的存储过程,经过多层嵌套循环查询多个表,并返回一个最终的结果集(打开的游标)。然后再在birt中直接调用以下就获取了结果集的纪录,并展示在页面中。为此,我在网上搜索了很多资料,但是没有一个完整的可以执行的DB2存储过程。研究好久了,终于写出来了一个模板性的示例出来。现在拿出来,和各位网友共同分享交流。
 
示例说明先创建一个临时表,并插入数据,然后查询临时表,返回游标。
 
create procedure testPrc()
 -- 返回一个纪录
 dynamic result sets 1
------------------------------------------------------------------------
-- sql 存储过程
------------------------------------------------------------------------

p1: begin
-- 定义一个全局临时表tmp_hy
declare global temporary table session.tmp_hy
    (
       dm varchar(10),
       mc varchar(10)        
    )
     with replace -- 如果存在此临时表,则替换
     not logged;  -- 不在日志里纪录
    -- 给临时表插入三条数据
    insert into session.tmp_hy values('1','1');
    insert into session.tmp_hy values('1','1');
    insert into session.tmp_hy values('1','1');
   
p2: begin   
 -- 声明游标
 declare cursor1 cursor with return for
  select * from session.tmp_hy;  
 -- 游标对客户机应用程序保持打开
 open cursor1;
 
end p2;
end p1
 
另:鉴于有人问到此例子怎么执行,我是在集成开发环境里执行的.运行存储过程的方法很多,可以存在高级编程语言里调用,也可以在命令行调用,也可以在sql开发工具里调用,没法一概而论,还有,这个游标,你要看到结果,需要逐条取出所有纪录.这些都是其它方面的知识,你可以去别的地方补充.我这里怎么运行的,以及怎么处理的,为了避免误导读者,我还是不说了.下面我给出我调用此存储过程得出的结果,如下图:
 
点击在新窗口查看全图
 
 
 
总结这个例子很简单,但是很实用,可以作为一个存储过程的模板来用。完全操作的是临时表,你在任何db2数据库下都可以执行,并查看结果。为了保持例子的简洁易懂,我没有设置输入输出参数,这些参数和Oracle里,高级变成语言中函数的参数差不多,所以就写了这个不带参数的。
 
题外话DB2的存储过程和函数与Oracle的差别太大,DB2存储过程允许返回值,还可以设定返回值的数量,而Oracle的存储过程是不允许返回值的;DB2的函数也可以返回值,也可以返回表,而Oracle返回比较随意。用DB2做开发是件很痛苦的事情,原因是没有很好的开发工具,不像Oracle有PL/SQL这样强大的开发工具可用,但是DB2的性能比Oracle的好,海量T级别的数据库尤为明显。目前我用的是Quest Central For DB2 4.3,功能很弱,连自动弹出表的列名功能都没有!DB2自带的开发中心更烂,没法用,shit!严重与IBM的品牌不相符合。不知道各位网友你们都在用什么开发工具呢?
 
 
 
 

本文出自 “熔 岩” 博客,转载请与作者联系!





    文章评论
 
2006-12-21 21:23:27
弱弱的问一个问题
如果db2的存储过程要传一些参数,select 语句中要用到这些变量,该怎么写,例如从学生表中读出成绩〉SCORE AND 姓名=NAME
拜托了

2006-12-22 09:08:41
其实还很简单,这个参数比如是:IN var_stuname varchar(20),这个表示传入一个参数,表示学生的姓名。现在就可以在存储过程中直接用这个变量了。

select * from student s
where s.name like '%' || var_stuname ||'%';

在此假定你有表 strudent ,表中有name字段。

其实就像高级语言中函数传递的参数一样,你可以直接拿来使用!

2006-12-22 10:00:20
为什么要用like呢?我这是一个动态sql语句,直接写name=var_name,为什么不可以?是不是对var_name要给个修饰符之类的呢?
还有一个问题,既然这样写这么麻烦,我想干脆直接把sql语句作为字符串输入参数传进去,可是总是出错呢
select name from student where name=‘water’

2006-12-22 10:50:48
不用like完全正确
但是变量上面不要加引号,否则就解析为字符串了.

还有,在你写sql提问的时候,也请你将问题叙述清楚,哪个是变量参数,什么类型...... 否则我无法猜测你的意思!

2007-06-01 15:06:32
你有没有使用过"开发者工作台"

2008-02-28 17:24:17
请问如何创建存储过程?
我指的是--在得到你的那段
"create procedure testPrc()..... end p1"
这段话在何处运行才能创建存储过程?
我在命令编辑器中使用根本不行,而且网上所有的建立的语句我使用全部报错,都是到某一步被告知“DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令”
我极度疑惑,望作者解惑!不尽感激

2008-02-29 09:13:53
存储过程是一段sql代码,用文本编辑器写,写好后通过数据库系统编译(也叫部署),编译通过后就驻留在数据库系统中,然后才能通过数据库系统来运行。
编译的方法: db2 -td@ -f 存储过程文件的名字.sql
@表示存储过程开始和结束的标识。

运行方法 db2 call 存储过程名(参数列表);

2008-02-29 09:43:04
非常遗憾,用编译的语句时,提示的是:
DB21061E 未初始化命令行环境。
也就是说根本没实别到我的命令。
注:我安装了DB2 9 后没有安其它东西,db2cc,db2Start这些是可以用的,但存储过程这句不能用。

我是不是还要安装什么东西,你的那句编译的方法才能用?

2008-03-01 14:49:56
你应该好好学习一下db2基础,然后做开发管理就容易多了。


 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: