2011-07-04 12 views
1

私たちは以下のようにPL/SQL(Oracleの)で記述された機能があります。今PostgreSQLのループのカーソル

CREATE OR REPLACE PROCEDURE folder_cycle_check (folder_key IN NUMBER, new_parent_folder_key IN NUMBER) IS 
    parent_of_parent NUMBER; 
    ILLEGAL_CYCLE EXCEPTION; 
    CURSOR parent_c IS 
    SELECT parent_folder_key FROM folder 
     WHERE folder_key = new_parent_folder_key; 
BEGIN 

IF folder_key = new_parent_folder_key THEN 
    RAISE ILLEGAL_CYCLE; 
END IF; 

FOR parent_rec IN parent_c LOOP 
    BEGIN folder_cycle_check(folder_key, parent_rec.parent_folder_key); END; 
END LOOP; 

END; 

を、私は似て達成するためにPL/pgSQL(PostgreSQLの)で、この同じ手順を書き換える必要があり機能性。私を助けて、pl/pgsql関数を送ってください。

編集(コメントからフォーマットされたコード)

CREATE OR REPLACE FUNCTION folder_cycle_check(IN folder_key INTEGER, IN new_parent_folder_key INTEGER) 
    RETURNS VOID 
AS $procedure$ 
    DECLARE parent_of_parent INTEGER; 
    PARENT_C CURSOR FOR 
     SELECT parent_folder_key 
     FROM folder 
     WHERE folder_key = new_parent_folder_key; 
BEGIN 
    IF folder_key = new_parent_folder_key THEN 
     RAISE EXCEPTION 'ILLEGAL_CYCLE'; 
    END IF 

    FOR parent_rec IN (SELECT parent_folder_key FROM folder WHERE folder_key = new_parent_folder_key) LOOP 
     PERFORM folder_cycle_check(folder_key,parent_rec.parent_folder_key); 
    END LOOP; 

    RETURN; 
END; 
$procedure$ 
LANGUAGE plpgsql;  
+0

あなたのPostgresのソリューションですべてのコンパイルエラーを持っていますか?はいの場合は、Postgresコード –

+1

と一緒に投稿してください。あなたの試行は何ですか?これは「私の仕事をしてください」というサイトではないことを覚えておいてください。試してみる必要があります。ここでは餌をスプーンしません。 – Bohemian

+0

種類の返信のためにボヘミアンに感謝します。これが私の試みです。 CREATE OR REPLACE FUNCTION folder_cycle_check(IN folder_key INTEGER、IN new_parent_folder_key INTEGER) $手続き$DECLARE parent_of_parent INTEGERに戻ります。 PARENT_C CURSOR FOR SELECT parent_folder_key FROMフォルダ WHERE folder_key = new_parent_folder_key; BEGIN IF folder_key = new_parent_folder_keyそれから RAISE EXCEPTION 'ILLEGAL_CYCLE'; END IF – vchitta

答えて

11

これは動作するはずです:

CREATE OR REPLACE FUNCTION folder_cycle_check (p_folder_key INT4, p_new_parent_folder_key INT4) RETURNS VOID AS $$ 
DECLARE 
    v_parent_rec RECORD; 
BEGIN 
    IF folder_key = new_parent_folder_key THEN 
     RAISE EXCEPTION 'ILLEGAL_CYCLE'; 
    END IF; 
    FOR v_parent_rec IN SELECT parent_folder_key FROM folder WHERE folder_key = p_new_parent_folder_key LOOP 
     PERFORM folder_cycle_check(folder_key, v_parent_rec.parent_folder_key) 
    END LOOP; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 
+0

完璧に動作します。ありがとう。 – vchitta

+1

ですが、postgresqlではPROCEDUREの代わりにFUNCTIONを使用してください。 – vchitta

+1

@vchitta:確かに。あなたが正しい。一定。 –

関連する問題