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)
总的来说,我甚至不确定这是否是我想做的最佳方式,任何建议都将不胜感激!
你可以做到的。使用语句的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
用于计数...
归档时间: |
|
查看次数: |
7463 次 |
最近记录: |