RPG - 将 DS 作为参数传递给过程

RPG - passing DS as arguments to procedure

我写了一个copybook(/COPY)程序,有这个接口:

DCL-PI *N VARCHAR(5000);
  FILE_NAME CHAR(10) CONST;
  DS_OLD VARCHAR(5000) CONST;
  DS_NEW VARCHAR(5000) CONST;
END-PI; 

此示例程序调用此过程。 FILE_DS_* 是具有 PFFILE 定义的外部 DS。

EXEC SQL SELECT * INTO :FILE_DS_OLD FROM PFFILE FETCH FIRST 1 ROW ONLY;

FILE_DS_NEW = FILE_DS_OLD;
FILE_DS_NEW.MYFIELD = 'MODIFIED';

RESULT = MYPROC('PFFILE':FILE_DS_OLD:FILE_DS_NEW);

我正在修改的字段被定义为 VARCHAR 并且它的原始值是,例如:

'PEN IS ON THE TABLE'

奇怪的是,在程序的入口点,我在 FILE_DS_NEW DS:

上得到了这个值
'MODIFIEDN THE TABLE'

我疯了,但找不到原因!有什么想法吗?

DS 的定义方式:

D FILE_DS_OLD   E DS                  EXTNAME(PFFILE) QUALIFIED INZ
D FILE_DS_NEW   E DS                  EXTNAME(PFFILE) QUALIFIED INZ
FILE_DS_NEW = FILE_DS_OLD;   (1)
FILE_DS_NEW.MYFIELD = 'MODIFIED';  (2)
  1. 您正在将所有 ds 数据从旧 ds 移动到新 ds。
  2. 您正在设置新 ds 的子字段。我打赌你的 myfield 是 char(8),所以你只是改变了新 ds 的前 8 个字节。

我猜您对 varchar 感到困惑。 Varchar 数据类型只是一种将数据保存到字段限制的方式。这意味着如果你有一个 varchar(10) 并且只有 'DATA' 这个字段只使用 6 个字节。如果将其更改为 varchar(1000),该字段仍将仅使用 6 个字节。

希望对您有所帮助。