2012-03-13 11 views
-1

は、入力が別cursor_functionによって関数に与えられ、別の関数にカーソル値を渡す。*iは所与の入力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は、これを解決するために私を助けていない、これは私の大きなデータベーステーブルの小さな説明ですが、私は合格するカーソル機能を必要としますその値を1つずつ別の関数に渡します。

+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:ええ、私のコメントで大胆に、それを得る、申し訳ありません。必要な情報が与えられれば、ずっと簡単になります。それがあなたのために働くことを冷やす! :) –

関連する問題