*我有一个函数,它将删除表中给定输入id的行,输入由另一个cursor_function给予函数。*
select * from t1;
id | col1
----+-------
1 | user1
2 | user2
3 | user3
4 | user4
5 | user5
(5 rows)
create or replace function del_t1(int) returns void as $$
declare
a alias for $1;
begin
delete from t1 where id = a;
return;
end;
$$language plpgsql;
create or replace function del_cur(ref refcursor) returns void as $$
declare
a int;
begin
open ref scroll for select id from t1 where id > 3 order by id desc;
fetch first from ref into a;
perform del_t1(a);
loop
a := 0;
fetch next from ref into a;
perform del_t1(a);
if (a=0) then
exit;
end if;
end loop;
end;
$$ language plpgsql;
执行该功能时,
postgres# select del_cur('t1');
它显示没有错误,没有输出,光标只是闪烁,PLZ帮我解决了这个,这是我的大数据库表的小描述,我需要一个游标函数,它会将其值一个接一个地传递给另一个功能。
答案 0 :(得分:0)
在您的示例中,函数del_cur(refcursor)
被声明为采用游标。但是你从来没有在函数中实际使用它 - 这个结构完全没有意义。
使用implicit cursor of a FOR loop },您要做的事情应该更容易
CREATE OR REPLACE FUNCTION del_stuff()
RETURNS void AS
$BODY$
DECLARE
_a int;
BEGIN
FOR _a IN
SELECT id FROM t1 WHERE id > 3 ORDER BY id DESC
LOOP
DELETE FROM t1 WHERE id = _a;
-- do other stuff?
END LOOP;
END;
$BODY$ LANGUAGE plpgsql;
我不明白需要按降序逐个删除行。涉及触发器吗?也许整件事情可以简单:
DELETE FROM t1 WHERE id > 3;