Search_path, используемый в функции, зависит от search_path, установленного в сеансе, который вызывает функцию.Вы можете изменить это по умолчанию для любого пользователя, вызывающего функцию, изменив пользователя:
ALTER USER some_user SET search_path TO new_schema,...; -- you may also want public or others after new_schema
В качестве альтернативы, вы можете изменить search_path, используемый только в функции, слегка изменив код:
CREATE FUNCTION new_schema.some_recursive()
RETURNS some_type
LANGUAGE sql
SET search_path TO new_schema -- this line changes search_path while inside the function. It will be reset on function exit.
AS $function$
-- do stuff
-- note the next line (no new_schema.-prefix)
some_recursive()
--do more
$function$
;
Вы также можете использовать PG_CONTEXT, как указано здесь: https://stackoverflow.com/a/41889304/895640, но это немного глупо ...
CREATE OR REPLACE FUNCTION recursive_test() RETURNS int AS $$
DECLARE
stack text;
fcesig regprocedure;
BEGIN
GET DIAGNOSTICS stack = PG_CONTEXT;
RAISE NOTICE 'stack: %', stack;
fcesig := substring(stack from 'function (.*?) line');
EXECUTE 'SELECT ' || fcesig;
END;
$$ LANGUAGE plpgsql
;
CREATE SCHEMA test2;
alter function recursive_test set schema test2;
NOTICE: stack: PL/pgSQL function test2.recursive_test() line 6 at GET DIAGNOSTICS
NOTICE: stack: PL/pgSQL function test2.recursive_test() line 6 at GET DIAGNOSTICS
SQL statement "SELECT test2.recursive_test()"
PL/pgSQL function test2.recursive_test() line 9 at EXECUTE
NOTICE: stack: PL/pgSQL function test2.recursive_test() line 6 at GET DIAGNOSTICS
SQL statement "SELECT test2.recursive_test()"
PL/pgSQL function test2.recursive_test() line 9 at EXECUTE
SQL statement "SELECT test2.recursive_test()"
PL/pgSQL function test2.recursive_test() line 9 at EXECUTE
NOTICE: stack: PL/pgSQL function test2.recursive_test() line 6 at GET DIAGNOSTICS
SQL statement "SELECT test2.recursive_test()"
PL/pgSQL function test2.recursive_test() line 9 at EXECUTE
SQL statement "SELECT test2.recursive_test()"
PL/pgSQL function test2.recursive_test() line 9 at EXECUTE
...