db2 для i: передача строки, содержащей запятую, в процедуре sql в предложении in - PullRequest
0 голосов
/ 12 мая 2018

У меня есть строка, содержащая строки, разделенные запятыми, в Java .. которую я передаю процедуре sql, вызываемой в Java ... Вот пример строки Java:

    String codeString = "'232/232','34fd/34//'";

код в sql db2 для i:

    create procedure history (in id varchar (3), in code varchar (2000))
   ......
   ......
   begin
   insert into table1
   select date_from, date_to, code
   from table2 
   where table2.serial= id
   and table2.status not in (code); 
   end

эта процедура sql вставляет ту же строку в table1.code, но не исключает table2.status в предложении in. ..

значение, вставляемое в table1.code: '232/232', '34fd / 34 //' (включая все одинарные кавычки и запятые)

Ответы [ 2 ]

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

Что вы здесь говорите:

and table2.status not in (code);

- это то же самое, что сказать:

and table2.status <> code;

Вы не говорите:

and table2.status not in ('232/232','34fd/34//');

Причина в том, что он проверяет status против всего code, а не какой-то части code. Разделенный запятыми список в code не анализируется. На самом деле никакие переменные не анализируются. Они взяты целыми. Если вам нужно несколько значений в предикате in, вам нужно либо несколько литеральных значений, либо несколько переменных, либо некоторая их комбинация.

Он работает для вставки, потому что он просто вставляет все значение code в столбец table1. Разбор не требуется.

Другой вариант, так как вы находитесь в процедуре, это самостоятельно разобрать список, разделенный запятыми, в массив строк (не собираюсь показывать вам это здесь), а затем использовать производную таблицу коллекции, чтобы преобразовать массив в таблицу, которая вы можете использовать в предикате in вот так:

status not in (select s.string from UNNEST(stringArray) as s(string))
0 голосов
/ 13 мая 2018

попробуй что-то вроде этого:

create procedure history (in id varchar (3), in code varchar (2000))

begin
DECLARE stmttxt varchar(2000);
SET stmttxt = 'insert into table1 select date_from, date_to, cast(''' concat replace(code, '''', '''''') concat ''' as varchar(2000)) from table2 where table2.serial= ' concat id concat ' and table2.status not in (' concat code concat ')'; 
EXECUTE IMMEDIATE stmttxt;
end;
...