2012-03-13 2 views
-1

가 입력 다른 cursor_function하여 함수에 부여하는 다른 기능으로 커서 값을 전달. *내가 소정의 입력 ID의 테이블의 행을 삭제하는 기능을 갖는다 *

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

프로그래머가 소프트웨어의 버전 번호를 제공하는 것은 물론입니다. 어떤 버전의 PostgreSQL을 사용합니까? –

답변

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; 
+0

** Postgresql 버전은 9.1입니다. 트리 구조 테이블에서이 함수를 사용하고 있습니다. 부모 함수를 삭제하기 전에 자식을 삭제하는 함수가 필요합니다. ** – MAHI

+0

** 위에서 언급 한 함수가 유용했습니다. postgresql의 전문가가 아니므로 postgresql을 배우기 시작했습니다 .. 감사합니다 .. ** – MAHI

+0

@MAHI : 예, 제 의견에 많은 대담을했습니다. 미안합니다. 필요한 정보가 주어지면 훨씬 쉬워 질 것입니다. 그것이 당신을 위해 일한다는 것을 차가워 요! :) –

관련 문제