技术文档 -- 主机存储过程简介

一. 什么是存储过程        

          主机存储程序是一个能被应用程序使用SQL CALL语句调用的用户编写的程序,其编译后被存放到主机的DB2服务器中,而用户通过SQL语句执行它。

      上图显示了存储程序的基本架构。我们在DB2服务器端嵌入SQL语句,只通过简单的CALL和RETURN来降低网络传输的数据量。     

  如果应用程序有以下情况之一,可以考虑使用主机存储程序来解决客户/服务器应用:

  - 执行两个或两个以上的SQL语句

  远程SQL语句会产生很多网络的发送与接收操作,这样的操作会导致相当大的系统开销

  - 包含可操作的或逻辑的过程

二. 存储过程分类

    1 外部程序(External procedures)

  外部存储程序是开发者使用合适的编程语言在服务器上开发的。所谓合适的语言,在z/OS服务器上主要有:COBOL,PL/I,C,C++,汇编,REXX,和 Java等。一个外部存储程序类似任何其他的SQL应用,他可以包含静态的或动态的SQL语句,IFI调用和通过IFI发布的DB2命令。除了REXX,你可以预编译、编译、链接和绑定源程序来建立恰当加载模块和包。下图显示了一个COBOL外部程序必要的格式,从这个例子你可以了解与一个COBOL子程序一致的框架。

    ID DIVISION.

    PROGRAM-ID. XFEREMP.

    ……

    LINKAGE SECTION.

    01 ……

    PROCEDURE DIVISION USING ...

    EXEC SQL

    ……

    END-EXEC.

    GOBACK.

  外部存储程序的源代码是从存储程序的定义中分离出来的。存储程序只能绑定一个包,而不是计划,因为他是在利用激活该计划的线程。存储程序的加载模块(该COBOL程序)必须被安置在一个加载库中,该库在WLM启动的JCL中被包含在STEPLIB DD 串联内。

  2 SQL程序

  SQL程序是以SQL程序语言编写的存储程序。SQL程序语言是基于SQL语句扩展的持久存储模块(SQL/PSM)。SQL程序执行的各种结构同各种当今各种主流程序语言的功能相同。他可以申明本地变量,通过表达式来计算变量,通过语句来控制程序流,接收和返回来自调用者的参数,返回结果集以及错误处理。跟外部存储过程一样,SQL程序包含存储程序申明和存储程序代码。大多数CREATEPROCEDURE 选项都一样。SQL存储程序申明的不同之处在于它们指定代码的位置,一个外部存储程序的申明指定该加载模块的名字,而一个SQL程序的申明则包含该存储程序的源代码。在V7和V8版本中,我们甚至可以为通过外部名字选项来为SQL程序指定其加载模块的名字。下边的例子是创建一个SQL程序的语句,其功能是更新员工工资:

    CREATE PROCEDURE UPDATE_SAL

    ( IN INRATE DECIMAL (7,2),   IN INEMPNO CHAR(6))

    LANGUAGE SQL

    UPDATEEMP

    SETSALARY = SALARY *INRATE

    WHEREEMPNO = INEMPNO

三. 存储过程流

  存储过程流的内容比较多,我们通过一个例子来介绍:

  一个雇员被抽调到另一个部门,随意地,也可能成为一个新部门的经理。存储程序XREFEMP首先向XFER_EMPPA表插入任何这个员工所从属于的已有活动项目,并且将相应行从EMPPROJACT 中删除。如果所有的行都被删除了,则一个项目管理过程将被激活。这个过程将控制任何由于员工的调动而不完全的活动项目。我们选择使用DB2的MQSeries函数来通知该过程END-MSG-TO-PROJ。


  上图描绘了存储过程流的一个例子。

  1. 首先在DB2服务器上为每一个应用程序创建一个线程。如果这个存储程序被一个远程客户端应用程序所调用,那么当客户端程序发出SQL CONNECT语句时这个线程将会被建立。如果这个应用程序在本地,那么当第一条SQL语句被执行时,该线程将会被建立。线程被创建之后,SQL语句才能被执行。
  2. 当一个客户端应用程序提交SQL CALL语句,该存储程序的名字和输入/输出参数将会传递到DB2服务器上。
  3. 当DB2服务器接收到SQL CALL语句,会去搜索SYSIBM.SYSROUTINES编目表中与存储程序名字相关的行。在这个表中,DB2获得加载模块相关的存储程序和运行环境的信息。他还要搜索编目表SYSIBM.SYSPARMS 来得到相关参数的信息,如:该参数是否为输入、输出、输入/输出或其数据类型是否是期望值。注意,这个编目信息一个为了避免过多I/O的缓存。
  4. 存储程序在围绕着DB2运行的代码地址空间中被执行。对于DB2 V7,如果我们使用DB2固定地址空间,单一的地址空间是最合适的;如果我们的存储程序使用WLM环境,复杂WLM(运行加载管理)地址空间是最合适的。DB2 V7 是最后一个支持创建单一DB2-管理存储程序地址空间的版本,在z/OS V8的DB2服务器中,所有最新创建的存储程序都必须使用基于WLM的存储程序地址空间。
  5. 当在一个地址空间执行存储程序的时候,为客户端应用程序建立的线程将会被重新启用。
  6. 控制信息连同输入和输出参数被传递到存储程序中。
  7. 在被终止前,存储程序为每一个输出参数赋值并将控制信息返回给DB2。
  8. DB2将从存储程序接收的输出参数和向客户端应用程序返回控制信息复制到客户端应用程序的参数区。
  9. 调用程序接收输出参数并继续执行相同类型的工作。客户端应用程序隐式或显示发出COMMIT语句。当存储程序为客户端应用程序返回基于在CREATE PROCEDURE语句中COMMIT ONRETURN 值的控制信息时DB2服务器可以则隐式提交。
  10. DB2服务器返回控制信息给客户端应用程序。

 


 

 




posted @ 2010-08-19 09:38  CICSer  阅读(509)  评论(0编辑  收藏  举报