在使用 SQL 的 ILE RPG 应用程序中使用主机结构

ILE RPG 数据结构名可用作主机结构名。 在 SQL 语句中使用数据结构名意味着指定组成数据结构的子字段名称列表。

当数据结构包含一个或多个未命名的子字段时,不能将数据结构名用作 SQL 语句中的主机结构。 指定的子字段可用作主变量。

将数据结构用作主机结构名称时,必须考虑以下事项:
  • 所有子字段都必须是有效的主变量声明。
  • 所有子字段都必须具有名称。
  • 不能使用 DIM 或分组关键字来定义任何子字段。
预编译器将跳过数据结构中按顺序定义的或与数据结构中较早的字节重叠的任何子字段。 这包括为了对齐或定位而跳过的字节数。 例如,在以下结构声明中,将跳过 FIRSTNAME 子字段,因为它定义为在 LASTNAME 子字段之前使用存储器。
DCL-DS PEMPL;
  LASTNAME CHAR(10) POS(11);
  FIRSTNAME CHAR(10) POS(1);
END-DS;

在以下示例中, BIGCHR 是没有子字段的 ILE 数据结构。 SQL 将对 BIGCHR 的任何引用视为长度为 642 的字符串。

DCL-DS BIGCHR LEN(642);
END-DS;
 

在下一个示例中, PEMPL 是由子字段 EMPNO , FIRSTN , MIDINT , LASTNA 和 DEPTNO 组成的主机结构的名称。 对 PEMPL 的引用使用子字段。 例如, CORPDATA.EMPLOYEE 放置在 EMPNO中,第二列放置在 FIRSTN中,依此类推。

DCL-DS PEMPL;
  EMPNO CHAR(6);
  FIRSTN CHAR(12);
  MIDINT CHAR(1);
  LASTNA CHAR(15);
  DEPTNO CHAR(3);
END-DS;
...
EMPNO = '000220';
...
EXEC SQL SELECT * INTO :PEMPL
  FROM CORPDATA.EMPLOYEE
  WHERE EMPNO = :EMPNO;
 

编写 SQL 语句时,可以限定对不在 QUALIFIED 数据结构中的子字段的引用。 使用数据结构的名称,后跟句点和子字段的名称。 例如, PEMPL.MIDINT 与仅指定 MIDINT 相同。 如果数据结构具有 QUALIFIED 关键字,那么必须使用数据结构名来引用子字段以限定子字段名称。

在此示例中,有两个数据结构 (一个 QUALIFIED 和一个 NOT QUALIFIED) 包含相同的子字段名称:

DCL-DS fststruct;
  sub1 INT(5);
  sub2 INT(10);
  sub3 INT(20);
  sub4 INT(10);
END-DS;

DCL-DS secstruct QUALIFIED;
  sub1 CHAR(4);
  sub2 CHAR(12);
  sub3 INT(20);
  myvar CHAR(5);
  sub5 CHAR(20);
END-DS;

DCL-S myvar INT(10);

secstruct.sub1 作为主变量引用将是长度为 4 的字符变量。

sub1 作为主变量的 SQL 数据类型将为小整数。 它从未限定的数据结构中选取其属性。

myvar 的主变量引用将使用独立声明来选取整数的数据类型。 如果使用 secstruct.myvar,那么将使用 QUALIFIED 结构中的字符变量。

如果未使用 secstruct 限定 sub5 ,那么不能引用它,因为它处于 QUALIFIED 数据结构中。

预编译器将识别使用 LIKEDS 关键字定义的主机结构。 但是,主变量的 SQL 语法仅允许在 SQL 语句中使用单一级别的限定。 这意味着如果数据结构 DS 具有子字段 S1 (定义为具有子字段 S2的数据结构) ,那么 SQL 语句无法使用标准主机变量名称 DS.S1.S2来引用 S2 。 如果使用 S1.S2 作为主变量引用,那么预编译器会将其识别为 DS.S1.S2。 以下其他限制适用:

  • 顶级结构 DS 不能是数组。
  • S1.S2 必须唯一。 即,在以 S1.S2结尾的程序中不得有其他有效名称,例如具有子字段 S1.S2的结构 S1 或具有子字段 DS3.S0.S1.S2的结构 DS3 。

示例

DCL-DS CustomerInfo QUALIFIED;
  Name CHAR(20);
  Address CHAR(50);
END-DS;

DCL-DS ProductInfo QUALIFIED;
  Number CHAR(5);
  Description CHAR(20);
  Cost PACKED(9:2);
END-DS;

DCL-DS SalesTransaction QUALIFIED;
  Buyer LIKEDS(CustomerInfo);
  Seller LIKEDS(CustomerInfo);
  NumProducts INT(10);
  Product LIKEDS(ProductInfo) DIM(10);
END-DS;

EXEC SQL
  SELECT * INTO :CustomerInfo.Name, :Buyer.Name FROM MYTABLE;

CustomerInfo。名称 将被识别为对 QUALIFIED 结构的变量的引用。 Buyer.Name 将定义为 SalesTransaction。Buyer.Name

不能在 SQL 语句中使用 SalesTransaction.Buyer.Name ,因为 SQL 语法中只允许一个级别的限定。 不能在 SQL 语句中使用 Product.Cost ,因为 cost 在维数组中。

如果有一个 SalesTransaction2SalesTransaction 一样定义,那么作为结构的子字段就不能在 SQL 语句中使用。 由于 SQL 只支持一级资格,因此对 Buyer.Name 的引用是含糊不清的。