我正在制作一个sql过程(在lib EXTLIB中),它将使用JDBC从外部系统调用。我们有一个用户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;
答案 0 :(得分: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 @