从函数内部,我需要知道该函数所属的架构。有什么办法知道在Postgresql中?
fyi,current_schema()
函数为我提供了当前会话的集合架构,这不是我想要的。例如,我现在在架构test1
中,可以调用函数test2.test_function()
。现在,该功能current_schema()
将提供test1
。但是我需要获取test2
,这是功能模式。
进行了一些研究并连接了几个答案,我想出了这个解决方案。
CREATE OR REPLACE FUNCTION parent_schema()
RETURNS text AS $$
DECLARE
stack text; fcesig text;
function_oid oid;
schema_name text;
BEGIN
GET DIAGNOSTICS stack = PG_CONTEXT;
fcesig := substring(stack from 'function (.*?) line');
function_oid := fcesig::regprocedure::oid;
SELECT routine_schema INTO schema_name FROM information_schema.routines WHERE regexp_replace(specific_name, '^.+?([^_]+)$', '1')::int = function_oid;
RETURN schema_name;
END;
$$ LANGUAGE plpgsql;
帮助我形成了这个的答案:
https://stackoverflow.com/a/32016935/5645769
https://stackoverflow.com/a/1347639/5645769
https://stackoverflow.com/a/24034604/5645769
据我所知,以可靠的方式不可能。
您在答案中提供的功能不起作用:
CREATE FUNCTION public.myfunc() RETURNS text
LANGUAGE sql
AS 'SELECT laurenz.parent_schema()';
CREATE FUNCTION laurenz.myfunc() RETURNS text
LANGUAGE sql
AS 'SELECT laurenz.parent_schema()';
您的功能给出了错误的答案:
test=> SELECT public.myfunc();
myfunc
---------
laurenz
(1 row)