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,这样效率更高,代码也更少。
如何从 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,这样效率更高,代码也更少。