创建外部存储过程

外部存储过程是指 用主机语言编写的过程,可以包含 SQL 语句。 外部程序的源代码与定义是分开的。

准备工作

在创建外部程序之前,请发送电子邮件至 在安装过程中配置 Db2 ,以便运行存储过程和用户定义的函数配置 Db2 ,以便在迁移期间运行存储过程和用户定义的函数

关于本任务

限制 :这些说明不适用于Java™存储过程。 创建 Java存储过程的过程有所不同。 准备过程因具体操作而异。

过程

创建外部存储过程:

  1. 使用汇编语言、C语言、C++语言、 COBOL 语言、REXX语言或 PL/I 语言编写外部存储过程的主体。
    限制:
    • 不包括显式附件设施调用。 在 WLM 建立的地址空间中运行的外部存储过程会隐式使用资源回收服务附件设施 (RRSAF) 调用。 如果外部存储过程调用了显式附件设施, Db2 会拒绝该调用。
    • 不包括SRRCMIT或SRRBACK服务电话。 如果外部存储过程调用SRRCMIT或SRRBACK, Db2 会将事务置于需要回滚操作的状态,并且CALL语句会失败。

    对于REXX程序,请继续执行步骤 3

  2. 对于汇编语言、C、C++、 COBOL 或 PL/I 存储过程,请通过完成以下任务来准备外部过程:
    1. 使用以下技术之一对应用程序进行预编译、编译和链接编辑:
      • Db2 预编译器和JCL指令用于编译和链接编辑程序
      • SQL语句协处理器
      建议 :将代码编译并链接编辑为可重入。

      使用资源回收服务附件设施的语言界面模块 DSNRLI 或通用语言界面模块 DSNULI 链接编辑应用程序。 当您使用这些模块链接编辑应用程序时,必须指定参数AMODE(31)。 (不支持24位应用程序。)

      如果您希望将存储过程设置为可重入,请参阅创建可重入的外部存储过程

      如果您想将您的程序作为 z/OS® 授权的程序运行,在链接编辑应用程序时,您还必须执行以下任务:
      • 通过指定参数值 AC=1 ,表明负载模块可以使用受限的系统服务。
      • 将存储过程的负载模块放在APF授权的库中。
      您可以使用 DYNAM 或 NODYNAM COBOL 编译器选项编译 COBOL 存储过程。 如果您使用DYNAM,请通过执行以下操作之一,确保动态加载正确的 Db2 语言界面模块:
      • 指定ATTACH(RRSAF) SQL处理选项。
      • 将DSNRLI模块复制到加载库中,并连接到 Db2 库的前面。 请使用会员名DSNHLI。
    2. 通过发出BIND PACKAGE命令,将DBRM绑定到一个 Db2 包中。

      如果您想控制对存储过程包的访问,请为调用应用程序的系统连接类型指定ENABLE绑定选项。

      存储过程只需要一个包。 您无需为存储过程绑定计划,也无需为调用应用程序绑定存储过程包。 对于远程访问场景,请求方和服务器端都需要安装一个软件包。

      有关存储过程包的更多信息,请参阅外部存储过程包

      以下示例中的 BIND PACKAGE 命令将 DBRM EMPDTL1P 绑定到集合 DEVL7083。
      BIND PACKAGE(DEVL7083) -
      MEMBER(EMPDTL1P) ACT(REP) ISO(UR) ENCODING(EBCDIC) -
      OWNER(DEVL7083) LIBRARY('SG247083.DEVL.DBRM')
  3. 使用带有EXTERNAL选项的CREATE PROCEDURE语句将存储过程定义为 Db2 。 使用外部名称子句指定当调用此过程时运行的程序加载模块的名称。

    如果您希望以 z/OS 授权的程序运行您的程序,请使用WLM ENVIRONMENT选项指定适当的环境。 存储过程必须在启动过程中运行,启动过程中,STEPLIB 链接中的所有库都经过 APF 授权。

    如果您希望在调用存储过程时向其传递环境信息,请在CREATE PROCEDURE语句中指定DBINFO和PARAMETER STYLE SQL选项。 当调用该过程时, Db2 会将包含环境信息的DBINFO结构传递给存储过程。 有关参数风格的更多信息,请参阅定义外部存储过程的链接约定

    如果将存储过程编译为可重入,请在CREATE PROCEDURE语句中指定STAY RESIDENT YES选项。 此选项可使程序保留在存储中。

  4. 通过发出GRANT EXECUTE语句,授权适当的用户使用存储过程。
    例如,以下语句允许授权ID为JONES的应用程序调用存储过程 SPSCHEMA.STORPRCA:
    GRANT EXECUTE ON PROCEDURE SPSCHEMA.STORPRCA TO JONES;

定义C语言存储过程的示例

假设您编写并准备了一个存储过程,该过程具有以下特征:
  • 存储过程的名称为B。
  • 存储过程有两个参数:
    • 一个名为 V1
    • 一个长度为9的字符输出参数,名为 V2
  • 存储过程是用C语言编写的。
  • 存储过程不包含任何SQL语句。
  • 同样的输入总是产生同样的输出。
  • 负载模块的名称为SUMMOD。
  • 数据包的集合名称为SUMCOLL。
  • 存储过程运行时间不得超过900个CPU服务单元。
  • 参数可以为空值。
  • 存储过程完成后将从内存中删除。
  • 该存储过程需要以下 Language Environment® 运行时选项:
    MSGFILE(OUTFILE),RPTSTG(ON),RPTOPTS(ON)
  • 存储过程是名为“工资单”的WLM应用程序环境的一部分。
  • 存储过程作为主程序运行。
  • 存储过程不会访问非Db2 资源,因此不需要特殊的 RACF® 环境。
  • 存储过程最多可返回10个结果集。
  • 当控制权返回到客户端程序时, Db2 不会自动提交更新。

下面的CREATE PROCEDURE语句定义了存储过程 Db2

CREATE PROCEDURE B(IN V1 INTEGER, OUT V2 CHAR(9))
  LANGUAGE C
  DETERMINISTIC
  NO SQL
  EXTERNAL NAME SUMMOD
  COLLID SUMCOLL
  ASUTIME LIMIT 900
  PARAMETER STYLE GENERAL WITH NULLS
  STAY RESIDENT NO
  RUN OPTIONS 'MSGFILE(OUTFILE),RPTSTG(ON),RPTOPTS(ON)'
  WLM ENVIRONMENT PAYROLL
  PROGRAM TYPE MAIN
  SECURITY DB2
  DYNAMIC RESULT SETS 10
  COMMIT ON RETURN NO;

后续操作

现在,您可以从应用程序Db2 命令行处理器调用存储过程。