내 관찰을 확인하고 왜 이런 일이 일어나는지 설명하기를 바라고 있습니다.
다음과 같이 정의 된 함수가 있습니다.
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의 결과를 선택하지 않고이 기능을 작동시키는 방법이 있습니까?