Ingres存储过程从表中删除多个记录

时间:2019-06-24 07:48:07

标签: ingres

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

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

END

请求的行应从表中删除

1 个答案:

答案 0 :(得分:0)

输入是varchar,因此删除语句中的内容实际上是这样的:

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

在数据库过程中,您无法运行“立即执行”,因此无法在没有引号的情况下构建删除字符串并动态执行(尽管如果调用程序具有“立即执行”,这可能是您的选择) “可用)。

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