Ingres хранимая процедура для удаления нескольких записей из таблицы - PullRequest
0 голосов
/ 24 июня 2019

Я создаю SP в Ingres для удаления нескольких записей из одной таблицы через идентификаторы, разделенные запятыми, но он не работает.Хотя, когда я выполняю его в отдельном запросе (без хранимой процедуры), он удаляет записи.

create procedure sptest
(
    In Ids varchar(300)
)
AS
BEGIN
   Delete from "ingres".mytable where request_id IN (:Ids);

END

Запрошенные строки должны быть удалены из таблицы

1 Ответ

0 голосов
/ 25 июня 2019

Ввод - это varchar, так что, по сути, то, что вы имеете в операторе удаления, выглядит примерно так:

удалить из mytable, где request_id в ('1,2,3,4');

Внутри процедуры базы данных вы не можете запустить «выполнить немедленно», поэтому вы не можете построить строку удаления без кавычек и выполнить ее динамически (хотя это может быть вариант для вас, если ваша вызывающая программа «выполняет немедленно» "доступно).

Чтобы обработать список IN в процедуре базы данных, я думаю, вам нужно будет перебрать строку ввода и удалить для каждого значения ... например:

set session authorization ingres;

drop table if exists mytable;
create table mytable(request_id integer);
insert into mytable values(1),(2),(5),(10);

drop procedure if exists sptest;
create procedure sptest
(
    In Ids varchar(300)
)
AS
declare msg = varchar(300) not null;
        eno = integer not null;
        rc  = integer not null;
        pos = integer not null;
        n   = varchar(300);
BEGIN
   while (length(:Ids) > 0)
   do
     pos = locate(:Ids, ',');
     n = left(:Ids, :pos-1);
     Ids = shift(:Ids, -1 * pos);
     msg = 'Removing ' + :n;
     message :msg;
     Delete from "ingres".mytable where request_id = integer(:n);
     select iierrornumber, iirowcount into :eno, :rc;
     msg = 'Error number '+varchar(:eno) + ' rowcount ' + varchar(:rc);
     message :msg;
   endwhile;
END;

execute procedure sptest('1,5,10');
select * from mytable;
...