从 table 中删除多条记录的 Ingres 存储过程

Ingres stored procedure to delete multiple records from table

我正在 Ingres 中创建一个 SP,以通过逗号分隔的 ID 从单个 table 中删除多条记录,但它不起作用。虽然当我在一个单独的查询(没有存储过程)中执行它时,它正在删除记录。

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

END

应从 table

中删除请求的行

输入是一个 varchar,所以实际上你在 delete 语句中的内容类似于:

从 mytable 中删除 request_id in ('1,2,3,4');

在数据库过程中你不能 运行 "execute immediate",所以你不能构建一个没有引号的删除字符串并动态执行它(尽管这可能是你的一个选项,如果您的调用程序有 "execute immediate" 个可用)。

要在数据库过程中处理 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;