I usually use pgsql to write my functions.
Example Update Function:
This function could be used as a save/creation of records. It passes back a boolean and id.
CREATE OR REPLACE FUNCTION Public.fn_my_function(param1 integer, param2 integer, OUT Success Boolean, OUT ID integer) AS $body$ DECLARE any_variable integer; BEGIN $3 = True; $4 = 3234; EXCEPTION $3 = False; $4 = -1; WHEN OTHERS THEN RAISE WARNING '[Public.fn_my_function] - UDF ERROR [OTHER] - SQLSTATE: %, SQLERRM: %',SQLSTATE,SQLERRM; END $body$ LANGUAGE plpgsql SECURITY INVOKER SET search_path = Public;
Get Function:
You can also return a table.
IE: RETURNS TABLE(id integer, data json) AS $body$
CREATE OR REPLACE FUNCTION Public.fn_get_function() RETURNS SETOF Public.My_Table AS $body$ BEGIN RETURN QUERY SELECT * FROM public.my_table t ORDER BY t.Name; END $body$ LANGUAGE plpgsql SECURITY INVOKER SET search_path = Public;
Comment Function:
COMMENT ON FUNCTION Public.fn_my_function(integer, integer) IS '';
Drop Function:
Notice how I use “IF EXISTS”. This is best because if it didn’t exist your script would fail.
DROP FUNCTION IF EXISTS Public.fn_my_function(Integer, Integer, Integer);
Trigger:
CREATE OR REPLACE FUNCTION Public.fn_my_function() RETURNS TRIGGER AS $BODY$ DECLARE v_old_data json; v_new_data json; BEGIN IF (TG_OP = 'UPDATE') THEN v_old_data := row_to_json(OLD.*); v_new_data := row_to_json(NEW.*); RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN v_old_data := row_to_json(OLD.*); RETURN OLD; ELSIF (TG_OP = 'INSERT') THEN v_new_data := row_to_json(NEW.*); RETURN NEW; ELSE RAISE WARNING '[Public.fn_my_function] - Other action occurred: %, at %',TG_OP,now(); RETURN NULL; END IF; EXCEPTION WHEN data_exception THEN RAISE WARNING '[Public.fn_my_function] - UDF ERROR [DATA EXCEPTION] - SQLSTATE: %, SQLERRM: %',SQLSTATE,SQLERRM; RETURN NULL; WHEN unique_violation THEN RAISE WARNING '[Public.fn_my_function] - UDF ERROR [UNIQUE] - SQLSTATE: %, SQLERRM: %',SQLSTATE,SQLERRM; RETURN NULL; WHEN OTHERS THEN RAISE WARNING '[Public.fn_my_function] - UDF ERROR [OTHER] - SQLSTATE: %, SQLERRM: %',SQLSTATE,SQLERRM; RETURN NULL; END; $BODY$ LANGUAGE plpgsql SECURITY INVOKER SET search_path = Public;