基本概念:
存储过程即stored procedure,一般会被简称procedure。要学这个先得弄明白另外一个概念:routine,这个一般翻译成“例程”
>>routine:存在server端,按应用程序逻辑编写的,可以通过client或者其他routine调用的数据库对象.
>3种类型:stored procedures,UDFs(自定义function),methods.
stored procedures:作为客户端的扩展但是运行在服务端;UDFs:扩展并且自定义SQL;methods:提供结构化类型的行为
>2种形式:
1)sql routines:完全用sql编写,通过create statement来注册routine.
2)external routines:用C,C++,Java,OLE编写,stored procedure还可用cobol编写。任何语言编写的都可以包含sql。
不同形式的routines可以互相调用,不管是什么语言编写的。
再来看看stored procedure.
>>stored procedures:可以通过call statement被client或者其他routine调用;stored procedures 和它的调用程序通过create procedure statement中的参数交换数据;stored procedures还能给它的调用者返回result sets.
stored procedures的优点:
1) 多个sql statement被调用者一次调用就能全部执行,这能减少client和server间的数据传输。
2)将数据库逻辑与应用程序逻辑隔离开
3)能返回多个result sets
4)如果被应用程序调用,运行起来stored procedure就像应用程序的一部分
缺点:
1)不能被sql statement调用,除了用call
2)返回的结果集不能直接被sql statement使用
3)多次调用之间不能保存调用的状态,即调用之间是独立的,无法传递信息。
一般的应用之处:
1)提供一个interface给一组sql statements。比如同时对多个表的insert操作
2)标准化应用程序逻辑(不理解,就是把db logic与app logic隔离吗?)
开发特性:
明白了这些基本概念后再来看看开发的特性。根据以上得知开发routine的语言有很多,这篇只讲sql procedure(即sql/sql pl写的procedure)。
>>各种语言的特性
sql:
1)效率高于java routine,基本上与c/c++ routine相当
2)完全用sql编写,能很快就能执行(making them quick to implement)
3)DB2认为sql routine是'safe'的因为全是sql,正因如此sql routine能直接在db engine上运行,并且有很好的运行效率和应用范围(good performance and scalability)
>>stored procedure feathures:
parameter modes:
3种类型的参数:1)IN :传入数据到stored procedure 2)OUT: stored procedure 返回数据 3)INOUT: 传入的那部分数据,在执行过程中被返回数据覆盖
result sets:
stored procedure通过cursor来传递结果集给调用者。存储过程必须为每一个需要返回的结果集保留一个游标。
>使用with return to caller/client来指定结果集返回的对象。指定为client将使得中间调用的routine不能获得结果集,只有client才能获得。
>使用dynamic result sets 语句来指定返回结果集的数目,这个数目保存在syscat.routines视图的result_sets字段。如果实际返回的结果集数目大于声明的这个数目,将发出一个warning(sqlcode +464,sqlstate 0100E)
sql stored procedure返回结果集的操作步骤:
1)declare cursor:
如:declare clientcur cursor with return to caller for select * from staff;
2)open the cursor:如 open clientcur;
3)不关闭游标退出stored procedure
开发:
最后终于来到了真正的开发了,刚才讲到sql procedure是由sql,sql pl写的,sql就没什么好说的了。关键说说sql pl (procedural language)
>>功能:控制逻辑流向,声明和设置变量,处理警告和异常。可用于例程(routine),触发器,动态复合语句(单个调用中的sql语句块)
>>控制语句:declare,set,for,get diagnostics,if,iterate,leave,return,signal,while
>>sql pl不能执行的sql:table,index,view的create和drop
>>begin atomic 开头,end 结尾
>>declare :定义变量 和 定义出错处理
declare sql-var-name data-type default default-values
declare condition-name condition for sqlstate value... //这里的condition一般做“异常”解释
>>set:声明变量 和 给触发器定义中的表中的列赋值
set pay = select salary from employee where empno = 5;//仅返回一个值
set pay = null;//空值
set pay = default;//变量定义的默认值
//专用寄存器的内容
set userid = userid;
set today = current date;
//同时给多个变量赋值
set pay =10000,bonus = 1500;
set (pay,bonus) = (10000,1500);
set (pay,bonus) = select (pay,bonus) from employee where empno = 5;
>>if/then/else
三种形式:
1) if then/end if 语句块
2) if then/else/end if
3) if then/elseif /else/end if
可以在if/then/else 语句中使用sql运算符,如:
if (salary between 10000 and 90000) then...
if (deptno in ('a00','b01')) then..
if (exist (select * from employee)) then...
if (select count(*) from employee)>0) then..
>>while
label:
while condition do
...sql pl ..
end while lable; //label可选
>>for:用于循环select返回结果集的行
格式:
label:
for row_label as select satement do
..sql pl..
end for label;//label可选
例子:
for emp as select * from employee where bonus >1000 do
set total_bonus = total_bonus +emp.bonus;
end for;
>>iterate:用来回到for或者while循环的开始重新执行
check_bonus:
for emp as select * from employee do
if(emp.bonus>10000) then
set total_bonus = total_bonus +emp.bonus;
else
iterate check_bonus;
end if;
end for check_bonus;
>>leave:相当于java中的break,需要一个label
>>signal:对出现异常的应用程序报警
signal sqlstate value set message_text = '...';//自定义一个sqlstate,7、8、9和I~Z开头的sqlstate
signal condition set message_text = '...';//自定义异常condition
>>get diagnostics:用在sql pl触发器或语句块(不是函数)内,返回update,insert,delete语句影响的记录数。
get diagnostics variable = row_count;
发表评论
-
SQLSERVER存储过程改为DB2存储过程
2009-11-21 23:38 1224CREATE PROCEDURE sp抄表 (@j ... -
探讨SQL语句技巧 优化DB2应用程序性能
2009-11-21 23:06 903本文以IBM的关系数据库 ... -
数据库优化之SQL语句性能调整原则
2009-11-21 23:05 745一、问题的提出 在应用系统开发初期,由于开发数据库数据比 ... -
DB2数据库SQL编码优化基础
2009-11-21 23:04 846简介 当要保证用 IBM DB2® Universal ... -
DB2数据库的隔离级解读
2009-11-21 23:01 817基本信息 摘要:在DB2中,共有四种隔离级:RS,RR, ... -
java调用db2存储过程例子
2009-11-21 22:44 41611. JAVA 调用db2存储过程最 ... -
DB2 中游标的使用以及 存储过程的写法
2009-11-21 22:39 1267from:http://j2megame.bokee.com/ ... -
DB2的存储过程调用例子
2009-11-21 22:35 2975语法说明1、procedure-name: 存储过程的名字,在 ... -
DB2下JAVA编程注意问题
2009-11-21 22:20 16591、DB2升级后JDBC无法连 ... -
DB2日期和时间的函数,及应用
2009-11-21 22:02 857DAYNAME 返回一 ... -
DB2表及sp管理
2009-11-21 22:00 12333.1 看存储过程文本 select text from ... -
DB2编程性能注意
2009-11-21 21:58 8262.1 大数据的导表 应该是export后再 ... -
DB2编程序技巧 (四)
2009-11-21 21:51 5391.16 存储过程fence及unfence fence的存储 ... -
DB2编程序技巧 (三)
2009-11-21 21:50 7981.12 从存储过程返回结果集(游标)的用法 1、建一s ... -
DB2编程序技巧(二)
2009-11-21 21:49 8121.6 类似charindex查找字符在字串中的位置 ... -
DB2编程序技巧(一)
2009-11-21 21:49 7221.1 建存储过程时Create 后一定不要用TAB键 ... -
DB2中通用的存储过程分页程序
2009-11-21 21:48 715CREATE PROCEDURE SALES.DB2PAGIN ... -
DB2编程技巧
2009-11-21 21:38 8721 DB2编程 1.1 建存储过程 ... -
DB2存储过程例子
2009-11-21 21:23 1576CREATE PROCEDURE IPD.st_inter_P ... -
DB2存储过程入门(一)
2009-11-21 19:58 1118首先,打开DB2开发中心,新建项目后,连接上指定的数据库。右键 ...
相关推荐
DB2 存储过程 SQL DB2 SQL存储过程基础 SQL
DB2 sql 存储过程基础,希望有更多的DB2存储过程资料共享
DB2 SQL存储过程语法官方权威指南,介绍DB2中存储过程的基本语法
db2存储过程、触发器等指南
db2 存储过程 db2 存储过程 db2 存储过程
DB2编程基础要点 DB2编程基础要点 sql 存储过程
DB2 SQL存储过程语法官方权威指南(翻译)
IBM DB2 SQL存储过程语法官方权威指南,初学者的查阅手册。
sql server 2000 分页存储过程,DB2分页存储过程,db2自动生成流水号存储过程
在本教程中,您学习了用于编写过程、用户定义函数和触发器的SQL Procedural Language。您学习了SQL Procedure Language 的所有基本要素,包括变量声明和赋值、语法和使用以及用于控制过程逻辑的流程的条件语句和迭代...
DB2存储过程语法大全 存储过程及其类型 动态SQL语句
DB2存储过程表空间sql专题整理学习
DB2+SQL存储过程语法官方权威指南,打好基础,从基本学起
DB2存储过程介绍 存储过程定义 指针 动态SQL语句
DB2_SQL存储过程编写说明
DB2工具比较少,资料也很少,由于开发过程中用到,也试用了很多工具,开始使用dbeaver.exe工具,用于查询更新数据挺好,但是不能导出创建脚本语句,会有缺失,也不能运行存储过程;最后发现SqlDbxPersonal挺好用,...
IBM DB2 UDB 9 中用于开发存储过程的SQL语法参考
这是一位有经验的前辈对于DB2 sql 语句总结,个人觉得很不错。
DB2.SQL.PL.Essential.Guide(DB2 存储过程_English)