簡體   English   中英

如何在 POSTGRESQL 中創建一個生成 FOR 循環的存儲過程?

[英]How to create a stored procedure in POSTGRESQL that makes a FOR loop?

我正在研究如何在 POSTGRESQL 中創建觸發器和存儲過程,並且我的任務是更新表 ALBUM 中名為 num_long_title_songs 的列。

需要統計一個名為songs的表中超過12個字符的歌曲的數量,然后更新ALBUM中該列的值。

我用 for 循環創建了下一個查詢,這正是我想要的:

do $$
begin
    FOR i IN 1..100 LOOP
    UPDATE ALBUM
    SET  num_long_title_songs =(SELECT count(s.title)
                                FROM ALBUM a,SONG s
                                WHERE a.id_album=s.id_album
                                AND LENGTH(s.title) > 12
                                AND a.id_album=i
                                GROUP BY a.id_album
                                ORDER BY a.id_album)
    WHERE id_album IN (SELECT a.id_album
                                FROM ALBUM a,SONG s
                                WHERE a.id_album=s.id_album
                                AND LENGTH(s.title) > 12
                                AND a.id_album=i
                                GROUP BY a.id_album
                                ORDER BY a.id_album);
    -- i will take on the values 1,2,3,4,5,6,7,8,9,10 within the loop
    END LOOP;
END; $$

問題是我需要創建一個存儲過程才能觸發。 我嘗試將其放入 CREATE FUNCTION 結構中,但我無法創建它...您能幫我了解如何將這個“for”循環放入 function 中嗎?

如果要更新表 ALBUM 中的現有行,只需運行以下UPDATE語句:

UPDATE ALBUM a
   SET num_long_title_songs = s.total
FROM ( SELECT s.id_album
            , count(s.title) AS total
         FROM SONG s
        WHERE LENGTH(s.title) > 12
        GROUP BY s.id_album
     ) AS s
WHERE a.id_album=s.id_album

如果要在表SONG中插入或更新行時自動更新表ALBUMnum_long_title_songs字段,則需要trigger function

CREATE OR REPLACE FUNCTION update_num_long_title_songs ()
RETURNS TRIGGER LANGUAGE plpgsql AS
$$
BEGIN
    UPDATE ALBUM a
       SET num_long_title_songs = s.total
    FROM ( SELECT s.id_album
                , count(s.title) AS total
             FROM SONG s
            WHERE LENGTH(s.title) > 12
              AND s.id_album = NEW.id_album
         ) AS s
    WHERE a.id_album=s.id_album ;
END ;
$$ ;
    
CREATE TRIGGER after_insert_update_SONG AFTER INSERT OR UPDATE OF title ON SONG
FOR EACH ROW EXECUTE FUNCTION update_num_long_title_songs () ;

AFTER 很重要,以便將在表SONG中插入或更新的新行考慮到num_long_title_songs的新值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM