将游标值传递给另一个函数

时间:2012-03-13 09:04:09

标签: sql postgresql variables cursor

*我有一个函数,它将删除表中给定输入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帮我解决了这个,这是我的大数据库表的小描述,我需要一个游标函数,它会将其值一个接一个地传递给另一个功能。

1 个答案:

答案 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;