Postgresql
Postgresql:如何將數組傳遞給 TG_ARGV 中的觸發函式?
我有一些相當通用的 Postgres 觸發器函式,我想在幾個不同的表中重複使用它們。為此,我將參數作為
CREATE TRIGGER
語句的一部分傳遞,因此它們將在 TG_ARGV 數組中可用,如文件中所述。只要我的所有參數都是標量,這工作就很好,但是其中有幾個確實應該表示為數組。
這是我正在嘗試做的一個簡化範例:
CREATE OR REPLACE FUNCTION example_function() RETURNS TRIGGER AS $$ DECLARE special_names text[]; special_users text[]; BEGIN special_names := TG_ARGV[0]; special_users := TG_ARGV[1]; IF NEW.name = ANY(special_names) THEN NEW.name = 'special'; END IF; IF NEW.user = ANY(special_users) THEN NEW.user = 'flag'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER on_create_flag_special BEFORE INSERT ON example_table FOR EACH ROW EXECUTE PROCEDURE example_function( ARRAY['magicname1', 'magicname2']::text[], ARRAY['user1', 'user2']::text[] );
Postgres 抱怨
錯誤:“[”處或附近的語法錯誤
第 5 行:數組
$$ ‘magicname1’, ‘magicname2’ $$::文本$$ $$,
在其他情況下,這是數組文字的有效語法(例如
SELECT ARRAY['magicname1', 'magicname2']::text[];
可以正常工作)。我也嘗試過使用其他語法變體,例如'{"magicname1", "magicname2"}'::text[]
但沒有任何成功。誰能建議將數組參數傳遞給觸發函式的好方法?這是不可能的,我應該放棄並通過 JSON 字元串或其他東西進行編碼/解碼嗎?
string_to_array()
在您的解決方案中僅當您想允許非標準數組語法時才有用。否則,直接投射會更簡單、更便宜。您可以在聲明時進行分配。像:CREATE OR REPLACE FUNCTION example_function() RETURNS TRIGGER LANGUAGE plpgsql AS $func$ DECLARE special_names text[] := TG_ARGV[0]::text[]; special_users text[] := TG_ARGV[1]::text[]; BEGIN IF NEW.name = ANY(special_names) THEN NEW.name = 'special'; END IF; IF NEW.user = ANY(special_users) THEN NEW.user = 'flag'; END IF; RETURN NEW; END $func$;
按照 Jeff 的建議,在觸發器中使用正確的數組語法:
CREATE TRIGGER on_create_flag_special BEFORE INSERT ON example_table FOR EACH ROW EXECUTE PROCEDURE example_function( '{magicname1,magicname2}', '{user1,user2}' );
{magicname1,magicname2}
是 Postgres 中用於輸入和輸出的數組的標准文本表示。