我正在研究如何在 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'回圈放在一個函式中嗎?
uj5u.com熱心網友回復:
如果要更新表 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
AND a.num_long_title_songs <> s.total ;
如果要在 table 中插入或更新行時自動更新table的num_long_title_songs欄位,則需要:ALBUMSONGtrigger 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
AND a.num_long_title_songs <> s.total ;
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 很重要,以便考慮為num_long_title_songsSONG的新值在表中插入或更新的新行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/362602.html
標籤:sql PostgreSQL的 for循环 存储过程 触发器
下一篇:如何選擇以X字母開頭的東西?
