簡體   English   中英

在postgresql中插入觸發器,動態語句

[英]Insert trigger in postgresql, dynamic statement

我正在嘗試將插入觸發器添加到表中以實現分區。 以下代碼有效:

CREATE OR REPLACE FUNCTION item_lines_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO item_lines_partitions.p11_1 VALUES (NEW.*);
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

我的問題是,當我嘗試使其動態化時(以便我可以根據獲得的值重定向到表),我無法將記錄(NEW.*)插入到動態語句中。 這是我嘗試做的事情:

CREATE OR REPLACE FUNCTION item_lines_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    EXECUTE format('INSERT INTO item_lines_partitions.p%s_%s VALUES ',NEW.tenant_id,NEW.store_id) || quote_literal(NEW.*);
    RETURN NULL;
END;

動態語句出現如下語法錯誤: PG::SyntaxError: ERROR: syntax error at or near "'(49563,,1,11,100125,100125,1,,...

我也嘗試使用EXECUTE <expression... $1> USING NEW.*但效果不佳。

關於如何將 NEW.* 表達式插入動態語句的任何想法?

謝謝!

嘗試這個:

EXECUTE
   format(
      'INSERT INTO item_lines_partitions.%I SELECT ($1::text::item_lines_partitions.%I).*',
      'p' || NEW.tenant_id || '_' || NEW.store_id,
      'p' || NEW.tenant_id || '_' || NEW.store_id
   )
   USING NEW;

在這里, NEW用作語句的參數並將類型轉換為適當的表類型。

你構造表格字符串的方式不安全,所以我改變了它。

暫無
暫無

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

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