RPG Embedded SQL 用列表删除多条记录

RPG Embedded SQL delete several records with a list

如何从 table 中删除特定记录?我有一个包含我必须删除的对象的列表。

我尝试将这些名称保存在带有分隔符的变量中,并将键列与这些变量进行比较。

PGNALIST = '(''PGM1'',''PGM2'',''PGM3'',...)'; 

EXEC SQL DELETE FROM FILE WHERE FILEPGNA IN :PGNALIST;

但它只有在我有一个只有一个程序名称的变量时才有效。

知道如何解决这些问题吗?

SQL 更新也需要这些... 目标是进一步使用嵌入式 Sql。

非常感谢

不能那样做...

对于静态 SQL,您必须有多个变量:

EXEC SQL 
  DELETE FROM FILE 
  WHERE FILEPGNA IN (:p1, :p2, :p3, ...);

当然,您需要知道需要传入的值的数量,或者至少是最大数量。

或者,您可以使用动态 SQL 在运行时构建语句..

   dcl-c QUOTE '''';
   dcl-s myStmt varchar(1000);

   myStmt = 'delete from file where filepgna in ('
              + QUOTE + 'PGM1' + QUOTE
              + QUOTE + 'PGM2' + QUOTE
              + QUOTE + 'PGM3' + QUOTE 
              + ')';
   exec sql
    execute immediate :myStmt;

请注意,QUOTE 常量只会让生活变得更轻松。

Charles 是正确的,您不能直接这样做。当您对 SQL 还不够深入时,经常会出现这些类型的问题。典型的 SQL 解决方案会从另一个 table 中提取删除列表,执行如下操作:

EXEC SQL 
    DELETE FROM FILE 
    WHERE FILEPGNA IN (
        SELECT KEY FROM OTHERTABLE WHERE KEY LIKE 'PGM%');

如果您已经从另一个 table 中拉取 PGNALIST,这样效率更高,代码也更少。