'Function does not exist in PostgreSQL
I have this Postgres code
CREATE PROCEDURE adjust_available(patientBed UUID)
LANGUAGE SQL
AS $$
UPDATE bed
SET available = false
WHERE bed.id = patientBed;
$$;
CREATE TRIGGER adjust_available
AFTER UPDATE OF bed ON patient
FOR EACH ROW
EXECUTE PROCEDURE adjust_available(bed);
However when you run this query. It says the function does not exist. However, you create it above?
The full error:
ERROR: function adjust_available() does not exist SQL state: 42883
Solution 1:[1]
Though the CREATE TRIGGER
statement allows a PROCEDURE
keyword for the EXECUTE
clause, it doesn't actually allow procedures to be executed. From the documentation:
In the syntax of CREATE TRIGGER, the keywords FUNCTION and PROCEDURE are equivalent, but the referenced function must in any case be a function, not a procedure. The use of the keyword PROCEDURE here is historical and deprecated.
Instead, you must use a trigger function, which must not declare arguments (though arguments can be accessed as strings via the special TG_ARGV[]
array variable) and must have a return type of trigger
or, for event triggers, event_trigger
. Speaking generally & simplistically, functions for row-level BEFORE
and INSTEAD OF
triggers should return NULL
to cancel the rest of the operation and NEW
to continue. The return value is ignored by AFTER
and statement-level BEFORE
triggers; it may as well be NULL
.
Based on the question sample code (untested):
CREATE FUNCTION adjust_available()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE bed
SET available = false
WHERE bed.id = TG_ARGV[0]::UUID;
RETURN NULL; -- return value for AFTER trigger is ignored
END
$$;
(Transferred from the question comments.)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | outis |