RPG Embedded SQL удаляет несколько записей со списком - PullRequest
0 голосов
/ 09 мая 2018

Как я могу удалить определенные записи из таблицы? У меня есть список объектов, которые я должен удалить.

Я пытался сохранить эти имена в переменной с разделителями и сравнить ключевой столбец с этими переменными.

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

EXEC SQL DELETE FROM FILE WHERE FILEPGNA IN :PGNALIST;

Но это работает, только если у меня есть переменная только с ОДНИМ именем программы.

Знаете, как я могу решить эту проблему?

Также они нужны для обновлений SQL ... Цель заключается в дальнейшем использовании встроенного Sql.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Чарльз прав в том, что вы не можете сделать это напрямую. Часто эти типы проблем возникают, когда вы недостаточно углубились в SQL. Типичное решение SQL вытянет список удаления из другой таблицы, выполнив что-то вроде следующего:

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

Если вы уже извлекаете PGNALIST из другой таблицы, это намного эффективнее и требует меньше кода.

0 голосов
/ 09 мая 2018

Не могу так сделать ...

Для статического 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 просто делает жизнь немного проще.

...