如何在plpgsql中的"EXECUTE format()"中使用变量

Hou*_*272 6 sql postgresql dynamic-sql plpgsql stored-functions

我想更新表中的列,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;
Run Code Online (Sandbox Code Playgroud)

总的来说,我甚至不确定这是否是我想做的最佳方式,任何建议都将不胜感激!

Erw*_*ter 5

可以做到的。使用语句INTO关键字EXECUTE

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

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

END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

呼叫:

SELECT grow('counter');
Run Code Online (Sandbox Code Playgroud)

使用OUT参数来简化整体。
format()手册中解释的语法

您可以只运行UPDATE而不是函数调用:

UPDATE stats SET counter = counter + 1 RETURNING counter;
Run Code Online (Sandbox Code Playgroud)

在很多情况下,使用动态SQL的功能不仅仅是不必要的复杂性。

替代设计

如果可能,请考虑使用不同的表布局:行而不是列(如@Ruslan所建议)。允许任意数量的计数器:

CREATE TABLE stats (
  tag text PRIMARY KEY
, counter int NOT NULL DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)

呼叫:

UPDATE stats
SET    counter = counter + 1
WHERE  tag = 'counter1'
RETURNING counter;
Run Code Online (Sandbox Code Playgroud)

或者也许考虑专门SEQUENCE用于计数...