我正在Ingres中创建一个SP,以用逗号分隔的ID从单个表中删除多个记录,但是它不起作用。虽然当我在单独的查询(没有存储过程)中执行它时,它正在删除记录。
create procedure sptest
(
In Ids varchar(300)
)
AS
BEGIN
Delete from "ingres".mytable where request_id IN (:Ids);
END
请求的行应从表中删除
答案 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;