指示符变量和存储过程

带有指示符变量的主变量可以与 CALL 语句配合使用,以向过程传递其他信息。

为了表示相关主机变量包含空值,指示变量被设置为负值:-1、-2、-3、-4或-6。 具有指示符变量的 CALL 语句按如下所示进行处理:

  • 如果指示符变量为负数,那么将为 CALL 语句上的关联主变量传递缺省值,并且未更改地传递指示符变量。
  • 如果指示符变量不为负数,那么将按原样传递主变量和指示符变量。

调用 SQL 存储过程或未使用 *EXTIND 选项编译的外部存储过程时,无法传递 -5 和 -7 扩展指示符值。 然后在 CALL 语句上发出错误。 当调用使用 *EXTIND 选项编译的外部过程时,可以传递扩展指示符值。

对于过程的输入参数以及从过程返回的输出参数,处理规则相同。 使用指示符变量时,正确的编码方法是先检查指示符变量的值,然后再使用关联的主变量。

以下示例说明了如何处理 CALL 语句中的指示符变量。 请注意,在使用关联变量之前,逻辑会检查指示符变量的值。 另请注意如何将指示符变量传递到过程 PROC1 (作为由 2 字节值数组组成的第三个自变量)。

注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。

假定过程定义如下。 ILE RPG 程序已编译为不允许扩展指示符。

 CREATE PROCEDURE PROC1
    (INOUT DECIMALOUT DECIMAL(7,2), INOUT DECOUT2 DECIMAL(7,2))
    EXTERNAL NAME LIB1.PROC1 LANGUAGE RPGLE
    GENERAL WITH NULLS);
 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Program CRPG
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    D INOUT1          S              7P 2
    D INOUT1IND       S              4B 0
    D INOUT2          S              7P 2
    D INOUT2IND       S              4B 0
    C                   EVAL      INOUT1 = 1
    C                   EVAL      INOUT1IND  = 0
    C                   EVAL      INOUT2 = 1
    C                   EVAL      INOUT2IND = -2
    C/EXEC SQL CALL PROC1 (:INOUT1 :INOUT1IND , :INOUT2
    C+                         :INOUT2IND)
    C/END-EXEC
    C                   EVAL      INOUT1 = 1
    C                   EVAL      INOUT1IND  = 0
    C                   EVAL      INOUT2 = 1
    C                   EVAL      INOUT2IND = -2
    C/EXEC SQL CALL PROC1 (:INOUT1 :INOUT1IND , :INOUT2
    C+                         :INOUT2IND)
    C/END-EXEC
    C     INOUT1IND     IFLT      0
    C*                   :
    C*                  HANDLE NULL INDICATOR
    C*                   :
    C                   ELSE
    C*                   :
    C*                  INOUT1 CONTAINS VALID DATA
    C*                   :
    C                   ENDIF
    C*                   :
    C*                  HANDLE ALL OTHER PARAMETERS
    C*                  IN A SIMILAR FASHION
    C*                   :
    C                   RETURN
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
End of PROGRAM CRPG
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Program PROC1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    D INOUTP          S              7P 2
    D INOUTP2         S              7P 2
    D NULLARRAY       S              4B 0 DIM(2)
    C     *ENTRY        PLIST
    C                   PARM                    INOUTP
    C                   PARM                    INOUTP2
    C                   PARM                    NULLARRAY
    C     NULLARRAY(1)  IFLT      0
    C*                   :
    C*                  CODE FOR INOUTP DOES NOT CONTAIN MEANINGFUL DATA
    C*                   :
    C                   ELSE
    C*                   :
    C*                  CODE FOR INOUTP CONTAINS MEANINGFUL DATA
    C*                   :
    C                   ENDIF
    C*                  PROCESS ALL REMAINING VARIABLES
    C*
    C*                  BEFORE RETURNING, SET OUTPUT VALUE FOR FIRST
    C*                  PARAMETER AND SET THE INDICATOR TO A NON-NEGATIVE
    C*                  VALUE SO THAT THE DATA IS RETURNED TO THE CALLING
    C*                  PROGRAM
    C*
    C                   EVAL      INOUTP2 = 20.5
    C                   EVAL      NULLARRAY(2) = 0
    C*
    C*                  INDICATE THAT THE SECOND PARAMETER IS TO CONTAIN
    C*                  THE NULL VALUE UPON RETURN. THERE IS NO POINT
    C*                  IN SETTING THE VALUE IN INOUTP SINCE IT WON'T BE
    C*                  PASSED BACK TO THE CALLER.
    C                   EVAL      NULLARRAY(1) = -1
    C                   RETURN
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
End of PROGRAM PROC1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++