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;
You must be logged in to post a comment.