前端可以使用服务程序内部的过程吗?

Can front end can use procedure inside of a service program?

我们要求前端团队在服务程序中使用哪些程序。我们可以通过调用服务程序内部过程的存储过程来实现吗?

前端---调用--->存储过程----调用--->服务程序内部过程

这可以做到吗?

是的,您可以,这是调用服务程序中的过程的存储过程示例。该程序在服务程序CrewWeb中称为DeleteTrip,它有一个输入参数和两个输出参数。

CREATE PROCEDURE CREWCALL.WEB_DELETETRIP ( 
    IN DOCNO DECIMAL(8, 0) , 
    OUT ERRORCODE INTEGER , 
    OUT ERRORMSG CHAR(100) ) 
    LANGUAGE RPGLE 
    SPECIFIC CREWCALL.WEB_DELETETRIP 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    EXTERNAL NAME 'CREWOBJ/CREWWEB(DELETETRIP)' 
    PARAMETER STYLE GENERAL ; 

是的,您可以将 external stored procedure 指向服务程序中的过程。

关键选项是 EXTERNAL NAMELANGUAGEPARAMETER STYLE 子句。

LANGUAGE RPGLE
EXTERNAL NAME 'MYLIB/MYSRVPGM(MyReallyCoolProcedure)'

请注意,您可以在 RPG IV 中使用大小写混合的过程名称。所以一定要使用通过 DSPSRVPGM.

显示的名称

现在让我们谈谈 PARAMETER STYLE,如果您试图快速重用现有程序,那么您可能想要使用 PARAMETER STYLE GENERAL。但是,这意味着存储过程不能也不会在空输入上被调用。

如果希望存储过程为CALLED ON NULL INPUT,则需要使用SQLGENERAL WITH NULLS的参数样式。问题在于,这两者都意味着一些额外的参数被隐式传递给 RPG 程序或过程。这意味着 RPG 代码的设计必须能够接受它们。

PARAMETER STYLE SQL 提供最好的界面。

Specifies that in addition to the parameters on the CALL statement, several additional parameters are passed to the (external) procedure. The parameters are defined to be in the following order:

  • The first n parameters are the parameters that are specified on the CREATE PROCEDURE statement.
  • n parameters for indicator variables for the parameters.
  • A CHAR(5) output parameter for SQLSTATE. The SQLSTATE returned indicates the success or failure of the procedure. The SQLSTATE returned is assigned by the external program. The user may set the SQLSTATE to any valid value in the external program to return an error or warning from the procedure.
  • A VARCHAR(517) input parameter for the fully qualified procedure name.
  • A VARCHAR(128) input parameter for the specific name.
  • A VARCHAR(1000) output parameter for the message text.

The following additional parameter may be passed as the last parameter:

  • A parameter for the dbinfo structure, if DBINFO was specified on the CREATE PROCEDURE statement.

我的首选做法是创建一个新的 RPGLE 包装器,它接受 PARAMETER STYLE SQL 所需的参数列表并调用现有的 RPGLE 程序。

这允许我在需要时接受一些 NULL 参数,并允许我更好地控制发生任何错误时传回的 SQLSTATE。

另一个很好的参考是 IBM 红皮书,External Procedures, Triggers, and User-Defined Functions on IBM DB2 for i