只是希望确认我的观察并获得关于为什么发生这种情况的解释。
我有一个函数定义为:
CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS '
UPDATE
users
SET
coin = coin + coins
WHERE
userid = users.id
RETURNING
users.id' LANGUAGE "sql" COST 100 ROWS 1000
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
当我从CTE调用此函数时,它将执行SQL命令,但不会触发该函数,例如:
WITH test AS
(SELECT * FROM __post_users_id_coin(10, 1))
SELECT
1 -- Select 1 but update not performed
另一方面,如果我从CTE调用函数,然后选择CTE的结果(或者直接在不使用CTE的情况下调用函数),它将执行SQL命令并触发该函数,例如:
WITH test AS
(SELECT * FROM __post_users_id_coin(10, 1))
SELECT
*
FROM
test -- Select result and update performed
要么
SELECT * FROM __post_users_id_coin(10,1)
由于我不太在意函数的结果(只需要执行更新即可),是否有任何方法可以在不选择CTE结果的情况下使它起作用?