跟屌丝一起学习 DB2 第五课 存储过程(一)

DB2 存储过程

一、什么是存储过程

受 DB2 服务器控制的一段可执行程序

可以通过SQL的CALL语句来完成对存储过程的调用

在存储过程中可以包含业务逻辑

存储过程可以在本地或远程进行调用

存储过程可以接收或传递参数,生成结果集

二、存储过程特征

包含使用sql语句的过程构造

存储在数据库中且在db2 服务器上运行;

可以由正在使用的sql的应用程序根据名称来调用;

允许应用程序分2部分允许,在客户机上运行应用程序,在服务器上运行存储过程

存储过程在应用程序中的优势

减少了客户机与服务器直接的网络使用率

增强了硬件和软件功能

提高了安全性

减少了开发成本并且提高了可靠性

集中处理了公共例程的安全性、管理和维护

通过sql pl 当前的语句集合和语言特性,可以用sql开发综合的、高级的程序

例如函数、存储过程和触发器。这样便可以将业务逻辑封装到易于维护的数据库对象中,从而提高数据库应用程序的性能。

SQL PL 支持本地和全局变量,包括声明和赋值,还支持条件语句和迭代语句、控制语句的转移、错误管理语句以及返回结果集的方法。

三、什么时候使用存储过程

使用存储过程的合适时机:

应用程序的性能无法满足预期时

客户端数量较多且应用程序中SQL代码分散时

应用程序需要进行繁重的数据库操作,同时这些操作并不需要进行太多的客户交互

应用程序代码更改频繁

需要对客户应用代码进行访问控制时

客户应用需要在一次操作中执行多条 SQL 语句

五、数据类型

字符型:char varchar

日期型 date

数字型 number decilmal integer

详细请看屌丝大哥 db2数据类型介绍的那一课

六、Db2 存储过程基本语法

6.1 存储过程结构

CREATE OR REPLACE PROCEDURE <过程名>

( [ IN | OUT | INOUT ]  参数名  数据类型  默认值 )

LANGUAGE  SQL

BEGIN

      业务逻辑代码

END;

IN(输入参数)

只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,对于存储过程而言它是只读的。

OUT(输出参数)

在存储过程结束时向调用者返回。一般在过程中都会被赋值。

INOUT(输入输出参数)

上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它也能够作为输出参数被修改和赋值。

复合语句实例

复合语句是指包含在BEGIN和END间的语句。它一般包括如下语句类型:

声明语句

赋值语句

控制语句

条件处理语句

说明:

1. 复合语句可以嵌套使用。

2. BEGIN语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。

6.2 变量声明与变量赋值

变量声明语法:

DECLARE 变量名  数据类型 初始值;

Delcare DiaoSiName varchar(20);

变量赋值语法 :set 变量名=值;

例如:给屌丝姓名变量赋值。

Set DiaoSiName = ‘奶娃’;

变量声明

DECLARE  my_var  INTEGER  DEFAULT  6;

条件声明

DECLARE  not_found  CONDITION  FOR  SQLSTATE  ‘02000’;

游标声明

DECLARE  c1  CURSOR  FOR  select  *  from  staff;

异常处理器声明

DECLARE  EXIT  HANDLER  FOR  SQLEXCEPTION  …;

语法

SET  lv_name  =  expression;

SET  lv_name  =  NULL;

示例

(1) SET  salary  =  salary  +  salary  *  0.1;

(2) SET  init_salary  =  NULL;

(3) SET  salary  =  (select  salary  from  employee  where empno  =  lv_emp_num);

注: 如果 SELECT 语句返回记录超过一行,示例 3 将会返回SQLERROR。

模块 - 规格说明(Module Specification)

模块可以发布type, SP, UDF以供外部使用。

CREATE  OR  REPLACE  MODULE  myMod;

ALTER  MODULE  myMod  PUBLISH

            TYPE  myRowTyp  AS  ANCHOR  ROW  myTab;

ALTER  MODULE  myMod  PUBLISH

            FUNCTION  myFunc(val1  ANCHOR  myTab.col1)

                RETURNS myRowTyp;

ALTER  MODULE  myMod  PUBLISH

            PROCEDURE  myProc(OUT  param1  ANCHOR  myTab.col2);

模块 - 实现(Module Implementation)

下面的代码是模块的实现部分:

ALTER  MODULE  myMod  ADD  VARIABLE  pkgVar  ANCHOR  myTab.col1;

ALTER  MODULE  myMod  ADD  FUNCTION   myFunc(val1  ANCHOR  myTab.col1)  RETURNS  myRowTyp

BEGIN

    DECLARE  var1  myRowTyp;

    SELECT  *  INTO  var1  FROM  myTab  WHERE  col1  <  val1  AND  col1  >  pkgVar;

RETURN  var1;

END

ALTER  MODULE  myMod  ADD  PROCEDURE  myProc(OUT  param1  ANCHOR  myTab.col2)

BEGIN

    DECLARE  varRow  myRowTyp;

SET  param1  =  varRow.col2  –  pkgVar;

END

模块 - 其他语句

删除整个模块

DROP  MODULE  myMod;

保留规格说明内容,删除实现

ALTER  MODULE  myMod  DROP  BODY;

删除模块中的存储过程(SP)

ALTER MODULE myMod DROP PROCEDURE myProc;

将模块的执行权限赋给joe

GRANT EXECUTE ON MODULE myMod TO joe;


七、控制语句


IF语句

格式:

IF  条件1   THEN  statement1;

ELSEIF  条件2  THEN  statement2;

ELSE  statement3;

   END  IF;

注:条件成立时为TRUE (真),不成立时为FALSE(假) 和 NULL

IF语句例子

IF  rating  =  1  THEN

UPDATE  EMPLOYEE  SET  salary  =  salary*1.10

     WHERE  empno  =  i_num;(如果满足于...时,薪水调整1.1倍)

ELSEIF  rating  =  2  THEN

UPDATE  EMPLOYEE  SET  salary  =  salary*1.05

     WHERE  empno  =  i_num;

ELSE

UPDATE  EMPLOYEE  SET  salary  =  salary*1.03

     WHERE  empno  =  i_num;

END  IF;

CASE语句(1 of 2)

简单CASE语句

稍加变形的CASE语句

LOOP语句

语法

[LABEL]  LOOP

    SQL-procedure-statements;

    END  LOOP  [LABEL];

示例

fetch_loop:  LOOP

FETCH  c1  INTO  v_firstname,  v_lastname;

     SET  counter  =  counter  +  1;

     IF  counter  =  51  THEN

          LEAVE  fetch_loop;

     END  IF;

END  LOOP  fetch_loop;

FOR语句

语法

[LABEL]  FOR  for-loop-name  AS  [cursor-name  CURSOR  FOR]

      select-statement  

DO

      SQL-procedure-statements;

    END  FOR  [LABEL];

示例

DECLARE  fullname  CHAR(40);

FOR  v1  AS  c1  CURSOR  FOR  SELECT  firstnme,  midinit,  lastname  FROM  employee

DO

             SET  fullname=lastname||‘,’||firstnme||’,’||midinit;

    INSERT  INTO  tname  VALUE  (fullname);

END  FOR;

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-16 04:25:25

跟屌丝一起学习 DB2 第五课 存储过程(一)的相关文章

跟屌丝一起学习 DB2 第五课 存储过程(二)

REPEAT语句 ftch_loop2: REPEAT     FETCH  c1  INTO  v_firstname,  v_midinit,  v_lastname; UNTIL  SQLCODE  <>  0  AND  REPEAT  ftch_loop2; WHILE语句 WHILE  at_end  =  0  DO     FETCH  c1  INTO  v_firstname,  v_midinit,  v_lastname;     IF  SQLCODE  =  100

跟屌丝一起学习 DB2 第五课 存储过程(三) 存储过程实例

客户在进行短信服务这个业务申请时,需要填写一些基本信息,然后根据这些信息判断这个用户是否已经存在于业务系统中.因为网上服务和业务系统两个项目物理隔离,而且网上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断.     解决方式是通过存储过程,以前也了解过存储过程,但没使用到项目中.不过经过一番努力最后还是完成了,期间遇到了一些困难,特写此文让对DB2存储过程还不熟悉的童鞋避免一些无谓的错误.     DROP PROCEDURE "PLName" @CREA

跟屌丝一起学习 DB2 第三课 创建表空间

缓冲池(bufferpool) 是一个内存块的集合,这些内存块采用页面的形式.在首次创建数据库时,同时创建了一个默认的缓冲池 IBMDEFAULTBP.可以在创建表空间时,或者在 Buffer Pools 视图中使用 Create New Bufferpool 向导,创建新的缓冲池. 缓冲池最重要的作用是,在数据库读写硬盘上的数据时帮助减少 I/O 开销.这是通过 I/O 预获取和页面清理器实现的.预获取能够减少读取页面的 I/O 开销,其原理是:预先判断特定查询可能需要的页面,然后将这些页面读

跟屌丝一起学习 DB2 第一课 安装DB2

如果您没有DB2的安装软件,那么您可以到IBM的官方网站上下载免费试用版,唉 苦逼的屌丝 只能用 免费版  你也可以选择Express-C 版本 网址如下:www-900.ibm.com/cn/software/db2/ 或者度娘 自己找 获得的安装文件是一个压缩包: DB2的安装1.解压DB2安装压缩包               解压获得的DB2安装压缩包: 图3 2.安装DB2 V8.2                     双击解压后安装文件目录中的"setup.exe"文件

短训学习录(五)——天晴了

早晨出门第一感觉是,在北京终于看到了蓝天,往日的闷热也一扫而光. 首要做的事情是,将<逆袭大学>为什么要做那样的安排写了一个材料发给出版社.耗费了心血的书的思路,还是要坚持,也希望能够得到理解,最后能有好的结果. 上午两节"问题求解",陈老师从算法方法和算法正确性方面做了引导,深奥的思想是可以用简单的问题交待清楚的.一直也在告诉学生搜索和排序很重要,陈老师展示了搜索就是人解决问题的最基本方法,搜索方法就是技术,N多的问题类都可以归结为搜索.用好的问题表达算法思想,用直观的东

SQL语言入门教程:第五课 删除数据库表格

第五课 删除数据库表格 在SQL语言中使用drop table命令删除某个表格以及该表格中的所有记录.drop table命令的使用格式为: drop table tablename: 例如: drop table employee; 如果用户希望将某个数据库表格完全删除,只需要在drop table命令后输入希望删除的表格名称即可.drop table命令的作用与删除表格中的所有记录不同.删除表格中的全部记录之后,该表格仍然存在,而且表格中列的信息不会改变.而使用drop

kvm虚拟化学习笔记(十五)之kvm虚拟机动态迁移

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1300783 相比KVM虚拟机静态迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机动态迁移无需拷贝虚拟磁盘文件,但是需要迁移到的虚拟主机之间需要有相同的目录结构虚拟机磁盘文件,本文这部分内容通过nfs来实现,当然也可以采用GFS2集群文件系统来实现,本文的动态迁移是基于共享存储动态迁移. KVM动态迁移目前有两种,一种是基于

多线程-VC++孙鑫第十五课聊天室程序,如何有UDP改成TCP通信

问题描述 VC++孙鑫第十五课聊天室程序,如何有UDP改成TCP通信 看了孙鑫的第十五课:<多线程和聊天室程序的创建>,对其中的聊天室UDP程序中不断接收数据部分比较感兴趣,想把它改成TCP的版本,但是出现了不少问题不知道该怎么解决. 改动部分如下: 1.在InitSocket()中添加了listen和accept函数 2.由于TCP中连上之后发送数据需要使用accept获得的套接字,所以在OnInitDialog()中定义pRecvParam->sock=m_client; pRecv

Linux命名空间学习教程(五)NET

本文讲的是Linux命名空间学习教程(五)NET,[编者的话]Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源.而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid.net.ipc.mnt.uts 等命名空间将容器的进程.网络.消息.文件系统和hostname 隔离开.本文是Linux命名空间系列教程的第五篇,重点介绍NET命名空间.DockerOne在撸代码的基础上进行了校对和整理. 阅读完上一篇关于NS namespac