2012-02-08 7 views
1

私はBOMテーブル(bomitem)のシーケンス番号を再配列するためにこの関数を作成しました。PostgreSQL関数

CREATE OR REPLACE FUNCTION seqincr(integer) 
    RETURNS SETOF bomitem AS 
$BODY$ 
DECLARE 
    pItemid ALIAS FOR $1; 
    _row bomitem%ROWTYPE; 
    seqint int; 
    _id int; 


BEGIN 
    seqint=8; 
    FOR _row IN SELECT * 
      FROM bomitem 
      WHERE ((bomitem_parent_item_id=pItemid)) 
    LOOP 
    RETURN NEXT _row; 
    _id = _row.bomitem_id; 
    seqint = seqint+2; 
    update bomitem set bomitem_seqnumber = seqint where bomitem_id=_id; 
    END LOOP; 

    RETURN; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100 
    ROWS 1000; 
ALTER FUNCTION seqincr(integer) 
    OWNER TO admin; 

例は以下のように個々のbomitem_parent_item_id上で動作:

SELECT * from seqincr(14917); 

私はそれが全体のBOMテーブルをresequencesよう

SELECT distinct bomitem_parent_item_id FROM bomitem; 

をループし、この機能を書き換えるしたいと思います。何をしようとする

答えて

1

は、CTEとはるかに簡単です:

WITH x AS (
    SELECT bomitem_parent_item_id 
     , row_number() OVER (ORDER BY bomitem_parent_item_id) AS rn 
    FROM bomitem 
    GROUP BY bomitem_parent_item_id 
    ORDER BY bomitem_parent_item_id 
    ) 
UPDATE bomitem b 
SET bomitem_seqnumber = 8 + 2 * rn 
FROM x 
WHERE x.bomitem_parent_item_id = b.bomitem_id; 

あなたはdata-modifying CTEための少なくとものPostgreSQL 9.1必要です。

または副問合せを使用して、あまりにも、以前のバージョンで動作します。

UPDATE bomitem b 
SET bomitem_seqnumber = 8 + 2 * rn 
FROM (
    SELECT bomitem_parent_item_id 
     , row_number() OVER (ORDER BY bomitem_parent_item_id) AS rn 
    FROM bomitem 
    GROUP BY bomitem_parent_item_id 
    ORDER BY bomitem_parent_item_id 
    ) x 
WHERE x.bomitem_parent_item_id = b.bomitem_id; 

しかし、あなたはwindow functionrow_number()のために、少なくとものPostgreSQL 8.4を必要としています。

+0

申し訳ありません申し訳ありませんが、私はあなたの答えに気づくのにとても時間がかかりました。時間をとっていただきありがとうございます。ソリューションで起こるのは、部品表の各コンポーネントが同じbomitem_seqnumberを取得することです。各新しい部品表メッセージは、グループの番号に対応する次のより高い整数を取得します。私が必要とするのは、bomitem_seqnumberを増分して、請求書の最初の構成要素にbomitem_seqnumberが10、次の12、次の14などがあるようにすることです。 –

+0

こんにちは、この質問で私を助けることができます:https://stackoverflow.com/questions/44318816/function-for-postgresql?noredirect=1#comment75643213_44318816?ありがとう –