从 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;
我正在 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;