some_procedure1 (user_id, param1, ..., paramN); ... some_procedureX (user_id, param1, ..., paramN);
set_user (id); some_procedure1 (param1, ..., paramN); .... some_procedureX (param1, ..., paramN);
CREATE TEMPORARY TABLE command for each temporary table to be used.
CREATE OR REPLACE FUNCTION set_var (p_var_name varchar, p_var_value varchar) RETURNS void AS
$$
DECLARE
v_cnt integer;
BEGIN
SELECT Count (pc.relname) into v_cnt
FROM pg_catalog.pg_class pc, pg_namespace pn
WHERE pc.relname = 'session_var_tbl'
AND pc.relnamespace = pn.oid
AND pn.oid = pg_my_temp_schema ();
IF v_cnt = 0 THEN
EXECUTE 'CREATE GLOBAL TEMPORARY TABLE session_var_tbl (var_name varchar (100) not null, var_value varchar (100)) <br />
ON COMMIT preserve ROWS ';
END IF;
UPDATE session_var_tbl
SET var_value = p_var_value
WHERE var_name = p_var_name;
IF NOT FOUND THEN
INSERT INTO session_var_tbl (var_name, var_value)
VALUES (p_var_name, p_var_value);
END IF;
END;
$$
LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION get_var (p_var_name varchar) RETURNS varchar AS
$$
DECLARE
v_cnt integer;
v_result varchar (100);
BEGIN
SELECT Count (pc.relname)
INTO v_cnt
FROM pg_catalog.pg_class pc, pg_namespace pn
WHERE pc.relname = 'session_var_tbl'
AND pc.relnamespace = pn.oid
AND pn.oid = pg_my_temp_schema ();
IF v_cnt = 0 THEN
v_result: = null;
ELSE
SELECT var_value
INTO v_result
FROM session_var_tbl
WHERE var_name = p_var_name;
IF NOT FOUND THEN
v_result: = null;
END IF;
END IF;
RETURN v_result;
END;
$$
LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION set_var (name text, val text) RETURNS text AS $$
if ($ _SHARED {$ _ [0]} = $ _ [1]) {
return 'ok';
} else {
return "cannot set shared variable $ _ [0] to $ _ [1]";
}
$$ LANGUAGE plperl;
CREATE OR REPLACE FUNCTION get_var (name text) RETURNS text AS $$
return $ _SHARED {$ _ [0]};
$$ LANGUAGE plperl;
custom_variable_classes = 'usrvar'
CREATE OR REPLACE FUNCTION set_var (p_var_name varchar, p_var_value varchar) RETURNS void AS
$ body $
BEGIN
PERFORM set_config ('usrvar.' || p_var_name, p_var_value, false);
END;
$ body $
LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION get_var (p_var_name varchar) RETURNS varchar AS
$ body $
DECLARE
v_var_value varchar;
BEGIN
SELECT INTO v_var_value current_setting ('usrvar.' || p_var_name);
RETURN v_var_value;
EXCEPTION
WHEN syntax_error_or_access_rule_violation THEN
v_var_value: = null;
RETURN v_var_value;
END;
$ body $
LANGUAGE 'plpgsql';
Source: https://habr.com/ru/post/44015/
All Articles