指示符变量和存储过程
带有指示符变量的主变量可以与 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
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++