передача значений курсора в другую функцию - PullRequest
0 голосов
/ 13 марта 2012

* У меня есть функция, которая удаляет строки в таблице для данного идентификатора ввода, входные данные передаются функции с помощью другой функции 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');  

это не показывает ошибки, никаких выходных данных, курсор просто мигает, плз, помогите мне решить эту проблему, это небольшое описание моих больших таблиц базы данных, мне нужна функция курсора, которая будет передавать ее значения одно за другим функция.

1 Ответ

0 голосов
/ 13 марта 2012

В вашем примере объявлена ​​функция del_cur(refcursor) для захвата курсора. Но вы никогда не используете его внутри функции - конструкция вообще не имеет никакого смысла.

То, что вы пытаетесь сделать, должно быть намного проще с неявным курсором цикла FOR :

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...