簡體   English   中英

如何在 plpgsql 中使用“EXECUTE format()”中的變量

[英]How to use variables in “EXECUTE format()” in plpgsql

我想更新表stats中的列,將特定列作為參數,然后返回該列的更新值 [只有 1 行]:

CREATE FUNCTION grow(col varchar) RETURNS integer AS $$
DECLARE
tmp int;
BEGIN
    tmp := (EXECUTE format(
            'UPDATE stats SET %I = %I + 1
            RETURNING %I',
            col, col, col
            )
    );
    RETURN tmp;
END;

總的來說,我什至不確定這是否是做我想做的最好的方式,任何建議將不勝感激!

可以這樣做。 使用EXECUTE語句INTO關鍵字

CREATE OR REPLACE FUNCTION grow(_col text, OUT tmp integer)
   LANGUAGE plpgsql AS
$func$
BEGIN

EXECUTE format(
 'UPDATE stats
  SET    %1$I = %1$I + 1
  RETURNING %1$I'
 , _col)
INTO tmp;

END
$func$;

稱呼:

SELECT grow('counter');

使用OUT參數來簡化整體。
手冊中解釋了format()語法

您可以只運行UPDATE而不是函數調用:

UPDATE stats SET counter = counter + 1 RETURNING counter;

具有動態 SQL 的函數不僅僅是不必要的復雜性的場景並不多。

另類設計

如果可能,請考慮使用不同的表格布局:行而不是列(如@Ruslan 所建議)。 允許任意數量的計數器:

CREATE TABLE stats (
  tag text PRIMARY KEY
, counter int NOT NULL DEFAULT 0
);

稱呼:

UPDATE stats
SET    counter = counter + 1
WHERE  tag = 'counter1'
RETURNING counter;

或者考慮一個專用的SEQUENCE來計數......

暫無
暫無

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

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