【问题标题】:DB2 SQL procedure - Calling initiate procedure before declarationDB2 SQL 过程 - 在声明之前调用启动过程
【发布时间】:2015-08-18 10:20:29
【问题描述】:

我正在制作一个将使用 JDBC 从外部系统调用的 sql 过程(在 lib EXTLIB 中)。我们有一个用户 EXTUSER,用于运行来自那里的所有请求。问题是这个用户只能有一个起始库,在我们的例子中是EXTLIB(如果有人知道如何添加更多,请告诉我并成为我公司的英雄)。我们有一个过程initiate 来启动环境(即将所有必要的库添加到 LIBL)。这需要在EXTLIB 中的所有过程开始时调用。

我的程序需要从我们内部库中的视图中获取数据:INTERLIB。问题是我们使用 ARCAD 进行版本/发布/一切管理,而 ARCAD 不喜欢限定符,所以它会自动删除它们,这意味着一开始的声明在 INTERLIB 中找不到视图,因此它停止了在到达initate 电话之前。

我需要一种方法来在声明之前运行调用,同时保留功能。我也对任何其他替代解决方案持开放态度。我唯一能想到的就是用 RPG 编码,但我们有很多简单的程序,这只是浪费时间。在 STRSQL 中手动创建过程不是一种选择,因为当 ARCAD 将版本转移到生产环境时,它会重新编译所有内容,从而删除我们在那里放置的任何手动限定符。

代码如下:

CREATE PROCEDURE MyProcedure ()
  LANGUAGE SQL
  SPECIFIC MYFILE
  CALLED ON NULL INPUT
  DYNAMIC RESULT SETS 1
BEGIN

  declare c1 cursor with return to client for
    select
      id,
      required
    from INTERLIB.cus_CustomerPurpose_v3_0

  call INITIATE();

  open c1;

  call DEINITIATE();
END;  

【问题讨论】:

  • chgusrprf extuser jobd(prodjobd)

标签: stored-procedures db2 ibm-midrange


【解决方案1】:

我认为你有两个选择:

1) 在存储过程中创建内部块,

CREATE PROCEDURE MyProcedure ()
  LANGUAGE SQL
  SPECIFIC MYFILE
  CALLED ON NULL INPUT
  DYNAMIC RESULT SETS 1
BEGIN
  call INITIATE();
  BEGIN
    declare c1 cursor with return to client for
      select
        id,
        required
      from INTERLIB.cus_CustomerPurpose_v3_0;
    open c1;
  END;
  call DEINITIATE();
END @

2) 调用另一个存储过程

CREATE PROCEDURE MyProcedure ()
  LANGUAGE SQL
  SPECIFIC MYFILE
  CALLED ON NULL INPUT
  DYNAMIC RESULT SETS 1
BEGIN
  call INITIATE();
  call another_SP();
  call DEINITIATE();
END @

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2012-06-20
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多